数据库:组织具有嵌套关系的表的最有效方式

Database: most efficient way to organize tables with nested has-many relationship

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

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

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

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

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

根据您的访问模式,此模型有意义:

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. 给定项目中存在的主题