【问题标题】:Database: most efficient way to organize tables with nested has-many relationship数据库:最有效的方式来组织具有嵌套的 has-many 关系的表
【发布时间】:2021-08-15 13:49:27
【问题描述】:

我需要以下结构: 项目 --(has many)--> 主题 --(has many)--> 文章

对于特定的项目,我想以最有效的方式查询文章

对于这种情况,最好的数据库架构是什么?我正在考虑以下选项:

  1. 经典的one-to-manyTopic.projectIdArticle.topicId 的关系。在这里,我担心必须先查询所有主题。
  2. 项目 --(has many)--> 文章 --(has one)--> 主题(通过 Article.projectId 和 Article.topicId)。如果我需要每个项目的主题列表,还可以添加Topic.projectId。这样我直接查询项目的文章(不是通过选项 1 中的主题)。我在这里担心的是重复主题与项目的关系:直接,通过文章。
  3. 您的选择?

我使用的是Prisma,所以这里可能有它自己的最佳实践。

【问题讨论】:

  • 如果你知道你的projectId = XXX,那么SELECT * FROM Article A JOIN Topic T ON A.topicId = T.topicId WHERE T.projectId = XXX 会得到你想要的。它只会检索TopicsprojectId = XXX,而不是全部检索。

标签: sql database relational-database prisma


【解决方案1】:

根据您的访问模式,这个模型是有意义的:

model Project {
  id       Int       @id @default(autoincrement())
  name     String
  topics   Topic[]
  articles Article[]
}

model Topic {
  id        Int       @id @default(autoincrement())
  project   Project?  @relation(fields: [projectId], references: [id])
  articles  Article[]
  projectId Int?
}

model Article {
  id        Int      @id @default(autoincrement())
  project   Project? @relation(fields: [projectId], references: [id])
  topic     Topic?   @relation(fields: [topicId], references: [id])
  projectId Int?
  topicId   Int?
}

通过此设置,您将能够获取:

  1. 与给定项目和相应主题对应的所有文章
  2. 每个主题的文章
  3. 给定项目中的主题

【讨论】:

  • 非常感谢! Topic 与 Project 的关系的重复呢:直接,通过文章。或者这是常见的做法?
  • 是的。如果没有额外嵌套的查询是您的主要关注点并且该操作很频繁,那么您可以复制关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多