【问题标题】:How to efficiently store tags for items in relational database?如何有效地在关系数据库中存储项目的标签?
【发布时间】:2021-09-22 17:40:40
【问题描述】:

一般来说,使实体中的所有属性都成为可能的 concat PK,还是一种不好的做法?一个产品可能有很多标签,我如何为每个产品存储这些标签?是否可以有一个具有 2 个属性的表“标签”:productid 和标签,并将它们都设为主键?

实体:

产品 > productid(PK)、名称、…………

TAGS > productid(FK), tags (concat PK)

谢谢。

【问题讨论】:

    标签: sql database composite-primary-key


    【解决方案1】:

    一般来说,就是把一个实体中的所有属性都变成一个concat PK 可能,或者这是一个不好的做法?一个产品可能有很多标签和 如何为每个产品存储这些标签?

    在最典型的标签用例中,一个标签可能适用于多个记录。对于最标准化的设计,您几乎已经达到了最佳设计:

    • 一个标签可用于(可能指)多个产品
    • 一个产品可能有多个标签

    这表明标签和产品之间存在多对多关系。这可以通过桥接表轻松实现。这种设计的一个优点是每个标签(和每个产品)记录的设计根本不包含外键,因此更简单。桥表的记录描述了标签和产品之间的关系。

    【讨论】:

      【解决方案2】:

      欢迎@君!虽然这个问题似乎更像是一个推荐问题,而不是更具体和技术性的问题,但我会尽力提供帮助。

      回答您的问题:

      是的,创建一个包含两列的表并将两列组合为主键是可能的,有时也很有用。一般来说,这并不被认为是不好的做法,并且像大多数事情一样,这取决于你在做什么。如果使用不当,任何好的做法都可能是坏事。

      就个人而言,我建议使用标签表(ProductId(PK,FK),标签(PK)),每行有 1 个标签。这简化了插入/删除,并使它们更具幂等性,如果可能存在多个用户同时编辑同一产品的标签的情况,这将更加安全和更好。

      复合主键还将确保:a) 没有产品具有相同名称的重复标签,并且 b) 自动创建索引以确保通过 ProductId 进行快速查询。

      【讨论】:

      • @scottb 的建议也很好:将所有标签存储在单独的表中可以进一步规范化数据,从而稍微降低存储要求,因为您的链接表可以只通过 int 标识列引用标签。这将需要两个查询来首先插入标签,然后添加链接,但这也很容易在事务中进行管理。
      猜你喜欢
      • 2012-06-21
      • 1970-01-01
      • 2010-09-26
      • 2010-09-30
      • 2011-05-02
      • 2011-05-25
      • 2017-05-26
      相关资源
      最近更新 更多