使用连接表与类型字段的权衡

时间:2011-01-23 01:03:15

标签: database-design

我正在深入了解如何使用与多个其他表相关的表来设计数据库。一个具体的例子是一个对不同类型的东西发表评论的网站 - 人们可以评论文章,或者他们可以对照片发表评论,或者他们可以评论人。

似乎有两种表示方式:

1)为每个其他表连接表 表:

  • 制品
  • articles_comments
  • 评论
  • comments_people
  • comments_photos
  • 照片

或 2)

  • 制品
  • 评论
  • 照片

并且注释表将有一个“type”字段和一个item_id链接回另一个表。

第一种方法似乎更“合适”,似乎我们应该没有使用外键限制的问题,而第二种方法有更少的表,在某些方面可能“更简单”,但我们可以使用FK限制,因为item_id可以与多个FK相关(AFAIK - 使用mysql innodb)。在我们的应用程序中可能不会有2-3个表有多个关系(评论,照片等)和5-10个需要关系的表。

我正在寻找有关哪种方法更好的建议。

2 个答案:

答案 0 :(得分:2)

我个人不喜欢选项#2。它代表了一个有争议的话题,即ONE BIG LOOKUP TABLE概念。

首先,我同意Yzmir - icky来管理。此外,它代表了OO对关系数据库设计的影响,这有点像混合苹果和橙子。虽然具有OO编程背景(包括ME ...)的人很容易想象“COmment对象”及其属性,但请考虑一下DB Design。示例1中的表名清楚地描述了它们所代表的实体以及它们之间的关系(多对多参考表)中实际发生的情况。它们也代表了更好地遵守“正常”形式。

RBDMS是关于表示实体及它们之间的关系,并不一定总是符合OO的原则。此外,规范化规则更倾向于选项#1。

选项#1,对我来说代表了更强大的RDB设计,并且更易于管理,更易于扩展,并且可能也会更快地执行。

答案 1 :(得分:1)

带有comment列的type表(枚举顺便提一下),似乎是更好的方法,因为您可能希望在将来发展“评论”。

拥有像你描述的四个表,它也适合你的Model类字段和它们之间的关系。

如果注释表为0对多关系,则对注释表使用“LEFT JOIN”。否则它是'INNER JOIN'。

享受。