我需要以下结构:项目--(has many)-->
主题--(has many)-->
文章
对于特定的项目,我想以最有效的方式查询文章。
对于这种情况,最好的数据库架构是什么?我正在考虑以下选项:
- 经典的
one-to-many
与Topic.projectId
和Article.topicId
的关系。在这里,我关心的是必须首先查询所有主题 -
项目
--(has many)-->
文章--(has one)-->
主题(通过Article.projectId和Article.topicId(。如果我需要每个项目的主题列表,还可以添加Topic.projectId
。通过这种方式,我直接查询Project的文章(而不是通过选项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?
}
有了这个设置,你就可以获取:
- 与给定项目和相应主题相对应的所有文章
- 每个主题的文章
- 给定项目中的主题