数据库设计:多个连接表或一个标识“表”列的表

时间:2012-10-16 08:16:34

标签: mysql database database-design

我正在设计一个可以标记任何内容的数据库,我可能希望能够选择具有特定标记的所有内容。

我正在努力应对以下两个选项,并希望得到一些建议。如果有更好的方法请告诉我。

选项A
多个“多对多”联接表。

tag:
  id
  tag

media:
  id
  title
  src
  creation

media_tags:
  id
  media_id
  tag_id

article:
  id
  title
  content
  creation

article_tags:
  id
  article_id
  tag_id

选项B
一个“标记引用”表,它使用“表”列来标识要加入的表。

tag:
  id
  tag

tag_reference:
  id
  row_id
  tag_id
  table

media:
  id
  title
  src
  creation

article:
  id
  title
  content
  creation

从维护的角度来看,选项B似乎是有利的,但考虑到SQL查询来选择所有内容,并且认为没有多个查询就不可能。

4 个答案:

答案 0 :(得分:2)

使用选项B 时,无法为其他表设置外键。因此,我会选择选项A ,并为每个m:n关系使用一个表。

“从维护的角度来看选项B” - 是一场噩梦。删除文章会发生什么?具有row_id的所有行都将保留在tag_reference表中。您始终需要手动更新这些条目。

答案 1 :(得分:1)

选项B包含多值依赖项 - 因此违反了4th normal form。我更喜欢选项A

答案 2 :(得分:0)

实际上,它取决于每个sql开发人员。但我更喜欢Option A,因为您可以轻松地知道表中的某个列是另一个表的foreign key假设它是真的)。

Option B设计有些糟糕,因为在列中存储表名是个坏主意。您可以在此处支出更多IFCASE

答案 3 :(得分:0)

第二个选项几乎阻止您使用任何JOIN来提高效率,迫使您使用慢速多选。

所以我会说第一种选择更为可取。