如何解决数据库:组织具有嵌套多关系的表的最有效方法
我需要以下结构:
项目 --(has many)-->
主题 --(has many)-->
文章
这种情况下最好的数据库架构是什么?我正在考虑以下选项:
- 与
one-to-many
和Topic.projectId
的经典Article.topicId
关系。在这里,我担心必须先查询所有主题。 -
项目
--(has many)-->
文章--(has one)-->
主题(通过 Article.projectId 和 Article.topicId)。如果我需要每个项目的主题列表,还可以添加Topic.projectId
。这样我直接查询项目的文章(而不是通过选项 1 中的主题)。我担心的是 Topic 与 Project 的关系重复:直接和通过文章。 - 您的选择?
我使用的是 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?
}
通过此设置,您将能够获取:
- 与给定项目和相应主题相对应的所有文章
- 每个主题的文章
- 给定项目中存在的主题