【问题标题】:SQL table design for tags. Each user has its own tags标签的 SQL 表设计。每个用户都有自己的标签
【发布时间】:2020-01-15 13:12:58
【问题描述】:

我有三张表,一张用于存储文章,一张用于所有标签,一张用于两者之间的关系:

[table: article]
------------------------------
id        title       content
------------------------------
1         title       content
2         title       content
3         title       content


[table: tag]
----------------
id        name
----------------
1         health
2         travel
3         sports


[table: article2tag]
------------------------
article_id        tag_id
------------------------
1                 1
1                 2
1                 3

第一篇文章 (article_id: 1) 附有所有标签(tag_id 1、tag_id 2 和 tag_id 3)。

我现在网站上只有一个用户,但我想创建更多用户,并且每个用户都有自己添加的标签。在这种情况下,我是否需要将 user_id 添加到 tags 表中以跟踪哪个标签属于哪个用户?

[table: tag]
-------------------------------
id        name         user_id
-------------------------------
1         health       1
2         travel       1
3         sports       1
4         sports       2
5         business     2

谢谢

【问题讨论】:

  • 可能信息不足。用户添加的标签是“私有的”吗?还是所有人都看得见?用户与标签相关联意味着什么?这种关系的本质是什么?多个用户可以添加标签吗?您当前的方法可能没问题,但这取决于几件事。

标签: postgresql


【解决方案1】:

是的,你应该有一个联结表来存储用户和标签之间的关系,但该表不应该有标签名称,只有标签 ID:

user_tags

user_id | tag_id
1       | 1
1       | 2
1       | 3
2       | 4
2       | 5

标签名称应该出现在此联结表中的原因是给定标签可能与多个用户相关联。在这种情况下,多次重复标签名称将是冗余信息,并浪费存储空间。相反,保持当前标签表不变,但删除 user_id 列。

【讨论】:

  • 谢谢,听起来不错,但这是否意味着我总共会有 4 张桌子?文章、标签、article2tag 和 user2tag?
  • @ZoltanKing 是的,没错。但是,请注意联结表 article2taguser2tag 相当精简,至少从它们只维护两个 ID 列的角度来看是这样。
【解决方案2】:

user_id 列添加到表tag 是正确的做法,就像您提供的示例数据一样,尽管id 列仅在您定义name 的组合时才需要作为参考user_id 作为主键。
这当然意味着 name 列将包含重复项,因为超过 1 个用户可能定义标签 sports 或任何其他标签。但这很好。
所以在这张表中:

[table: tag]
-------------------------------
id        name         user_id
-------------------------------
1         health       1
2         travel       1
3         sports       1
4         sports       2
5         business     2

sports 定义了两次,两个用户各定义一次。
如果user_id = 1 决定将标签重命名为water sports,那么通过使用user_id = 1name = 'sports' 更新行,只会对表进行1 处更改。
如果用户添加或删除标签,那么您所要做的就是向表中添加新行或从表中删除一行。

【讨论】:

    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    相关资源
    最近更新 更多