首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设计可对多个数据库表进行标记的标记系统

设计可对多个数据库表进行标记的标记系统
EN

Stack Overflow用户
提问于 2010-03-02 10:57:46
回答 2查看 535关注 0票数 3

我想让用户标签项目,以便他们可以搜索他们使用标签。干净利落地实现这一点的最好方法是什么?到目前为止,我提出的解决方案只涉及到向我当前的数据库系统中添加两个额外的表。

代码语言:javascript
复制
<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个表,它应该被证明工作得很好,不是吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-02 11:09:46

我建议您引入一个多列外键,而不是在TagLink表中使用多个"TrackableProd_N_id“列,例如

代码语言:javascript
复制
   TagLink table
      int ProdGroup    -- "points" to table 1 vs. table 2 etc.
      int ProductId
      int TagId

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

票数 1
EN

Stack Overflow用户

发布于 2010-03-02 11:08:54

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

代码语言:javascript
复制
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)

当然,上面的模式是伪代码形式的。

所以在我看来,您的模式是正确的,但有一个例外。如果您想标记两个表,我将为每个产品类型创建单独的标签表(在您的案例中为Trackable Product1和Trackable Product2表),并创建两个交叉表。所以你应该有六张桌子。

但请确保使用正确的索引,否则它不会很好地扩展:)

更新:

或者,如果您希望能够用相同的标记来标记这两种产品类型,可以向包含产品组的交叉表中添加另一个字段,并将其添加到多主键中(如mjv;所指出的)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2360629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档