对数据库中的可标记项进行建模

时间:2011-09-12 17:18:24

标签: sql database-design tags many-to-many

我将帖子存储为帖子作为多对多关系,例如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 

这迫使我为每个要标记的实体创建一个新表,但它使我更容易强制执行参照完整性。

每种方法有哪些优点和缺点?

2 个答案:

答案 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,它应该是项类型表的外键。