我将帖子存储为帖子作为多对多关系,例如this post。
我现在想扩展标签,以便能够标记除帖子之外的实体。我将所有这些都放在名为帖子,链接,文章等的表格中。我应该选择:
tags_items
tag_id | item_id | item_type
-----------------------------
1 2 post
1 42 link
3 7 article
或创建多个表
tags_posts
tag_id | post_id
tags_links
tag_id | link_id
tags_article
tag_id | article_id
这迫使我为每个要标记的实体创建一个新表,但它使我更容易强制执行参照完整性。
每种方法有哪些优点和缺点?
答案 0 :(得分:1)
在这两个选择中,我更喜欢第二个。正如你所说,它使R.I.更容易。另一种选择是超级键入您的可标记项目。他们需要共享ID方案,但假设ID都是完全内部(应该是任何好的代理键),这应该不是问题。
Taggable_Items
tag_item_id INT (PK)
Posts
post_id INT (PK, FK to tag_item_id in Taggable_Items)
posted_by INT (FK to your Users table or whatever)
post_text VARCHAR(MAX)
...
Links
link_id INT (PK, FK to tag_item_id in Taggable_Items)
url VARCHAR(1000)
description VARCHAR(MAX)
...
Tags
tag_id INT (PK)
name VARCHAR(20)
Tagged_Items
tag_item_id (PK, FK to tag_item_id in Taggable_Items)
tag_id (PK, FK to tag_id in Tags)
我希望这很清楚。如果没有意义,请发表评论。
答案 1 :(得分:0)
你应该进一步采取你的第一个选择。而不是将item_type作为varchar或char,它应该是项类型表的外键。