【问题标题】:Designing tag system that can tag multiple db tables设计可以标记多个数据库表的标记系统
【发布时间】:2011-01-22 13:40:16
【问题描述】:

我希望允许用户标记项目,以便他们可以使用标记搜索它们。干净地实现这一目标的最佳方法是什么?到目前为止,我提出的解决方案只涉及在我当前的数据库系统中添加两个额外的表。

<db Trackable product 1>
int id;
info etc
</>

<db Trackable product 2>
int id;
info etc
</>

//defines the M:M relationship between Tag and various types of Trackable products
<db TagLink>
int trackableProd1Id
int trackableProd2Id
int tagId
</>

<db Tag>
int tagId
tag name etc
</>

这是一个好方法吗?这种方法的一个好处是它应该可以很好地扩展,并且它还允许我在将来通过简单地向 TagLink 表中添加一个列来添加更多可跟踪的产品。如果我计划跟踪 10 个表,这显然不是一个好主意,但对于多达 3-4 个表,它应该证明工作良好,不是吗?

【问题讨论】:

    标签: php database tags tagging


    【解决方案1】:

    TagLink表中不要有多个“TrackableProd_N_id”列,建议你引入一个多列外键,比如

       TagLink table
          int ProdGroup    -- "points" to table 1 vs. table 2 etc.
          int ProductId
          int TagId
    

    以这种方式,当出现其他产品来源时,您只需为它们“发明”一个新的 ProdGroup 编号,并使用 ProductId(或所述表中的其他主键)。

    【讨论】:

      【解决方案2】:

      嗯,通常标签是通过多对多关系(如果你愿意的话,可以是 m:n 关系)实现的。共有三个表:

      tags
          id INT NOT NULL AUTO INCREMENT
          name VARCHAR NOT NULL
          .
          .
          .
          possibly other fields
          .
          .
          .
          PRIMARY KEY (id)
      
      items_you_want_to_tag
          id INT NOT NULL AUTO INCREMENT PRIMARY KEY
          name VARCHAR NOT NULL
          .
          .
          .
          possibly other fields
          .
          .
          .
          PRIMARY KEY (id)
      
      xref
          tag_id INT NOT NULL
          item_id INT NOT NULL
          FOREIGN KEY (tag_id) REFERENCES tags(id)
          ON UPDATE CASCADE ON DELETE CASCADE,
          FOREIGN KEY (item_id) REFERENCES items_you_want_to_tag(id)
          ON UPDATE CASCADE ON DELETE CASCADE,
          PRIMARY KEY (tag_id, item_id)
      

      上面的架构当然是伪代码。

      所以你的架构在我看来几乎是正确的,但有一个例外。如果您想标记两个表,我将为每种产品类型创建单独的标签表(在您的情况下可跟踪产品 1 和可跟踪产品 2 表),并创建两个交叉表。所以你会有六张桌子。

      请确保使用正确的索引,否则无法很好地扩展:)

      更新:

      或者,如果您希望能够使用相同的标签标记两种产品类型,请将另一个字段添加到包含产品组的交集表中,并将其添加到多主键中(正如 mjv 已经指出的那样;)) .

      【讨论】:

      • 嘿,非常感谢。 “为每个表创建单独的标签表并创建两个交叉表”的主要好处是什么?如果您开始添加更多产品,则必须开始为每个产品添加两个新表,这使得在不大量更改应用程序代码的情况下更改数据库变得更加困难。
      • @Nick:在我的答案底部阅读我的更新。如果您希望能够对两种产品类型使用相同的标签,则不要添加另一个交集和标签表,只需将产品组添加到当前交集表并将其添加到多主键(如 mjv 正确指出)。我误解了您的问题,并认为您希望为每种产品类型设置单独的标签集。我的错。
      • @Nick:还有一件事。为什么将产品放在不同的表格中?他们有那么不相似吗?将所有产品放在一个表中并添加一个类型字段来标识产品类型还不够吗?只是一个想法。
      猜你喜欢
      • 2012-07-23
      • 1970-01-01
      • 2018-11-20
      • 2017-03-24
      • 2011-02-07
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 2016-08-21
      相关资源
      最近更新 更多