如何在关系数据库中有效地存储项目的标签?

How to efficiently store tags for items in relational database?

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

实体:

PRODUCT > productid(PK), name, …………

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

谢谢。

Generally speaking, is making all attributes in an entity a concat PK possible, or is it a bad practice? A product may have many tags and how do I store these tags for each product?

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

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

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

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

回答您的问题:

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

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

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