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