我正在设计一个可以标记任何内容的数据库,我可能希望能够选择具有特定标记的所有内容。
我正在努力应对以下两个选项,并希望得到一些建议。如果有更好的方法请告诉我。
选项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查询来选择所有内容,并且认为没有多个查询就不可能。
答案 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
设计有些糟糕,因为在列中存储表名是个坏主意。您可以在此处支出更多IF
或CASE
。
答案 3 :(得分:0)
第二个选项几乎阻止您使用任何JOIN来提高效率,迫使您使用慢速多选。
所以我会说第一种选择更为可取。