0

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

我正在为以下两个选项而苦苦挣扎,希望得到一些建议。如果有更好的方法请告诉我。

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

标签:
  ID
  标签

媒体:
  ID
  标题
  源代码
  创建

媒体标签:
  ID
  media_id
  tag_id

文章:
  ID
  标题
  内容
  创建

文章标签:
  ID
  article_id
  tag_id

选项 B
单个“标记引用”表,它使用“表”列来标识要连接到哪个表。

标签:
  ID
  标签

标签参考:
  ID
  row_id
  tag_id
  桌子

媒体:
  ID
  标题
  源代码
  创建

文章:
  ID
  标题
  内容
  创建

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

4

4 回答 4

2

使用Option B时,您不能为其他表设置外键。因此,我会选择选项 A和每个 m:n 关系的一个表。

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

于 2012-10-16T08:22:27.430 回答
1

选项 B 包含一个多值依赖,因此违反了第四范式。我更喜欢选项A

于 2012-10-16T08:27:59.473 回答
0

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

Option B有点糟糕的设计,因为在列中存储表名是个坏主意。你可以花更多的钱IFCASE在这里。

于 2012-10-16T08:18:48.313 回答
0

第二个选项几乎可以防止您使用任何 JOIN 来获得高效的 SQL,从而迫使您使用慢速多选。

所以我想说第一种选择要好得多。

于 2012-10-16T08:26:23.263 回答