我想让用户标签项目,以便他们可以搜索他们使用标签。干净利落地实现这一点的最好方法是什么?到目前为止,我提出的解决方案只涉及到向我当前的数据库系统中添加两个额外的表。
<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个表,它应该被证明工作得很好,不是吗?
发布于 2010-03-02 11:09:46
我建议您引入一个多列外键,而不是在TagLink表中使用多个"TrackableProd_N_id“列,例如
TagLink table
int ProdGroup -- "points" to table 1 vs. table 2 etc.
int ProductId
int TagId以这种方式,当出现其他产品源时,您只需要为它们“发明”一个新的ProdGroup编号,并使用ProductId (或来自所述表的其他主键)。
发布于 2010-03-02 11:08:54
嗯,通常标签是用多对多关系实现的(如果你愿意,可以用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)当然,上面的模式是伪代码形式的。
所以在我看来,您的模式是正确的,但有一个例外。如果您想标记两个表,我将为每个产品类型创建单独的标签表(在您的案例中为Trackable Product1和Trackable Product2表),并创建两个交叉表。所以你应该有六张桌子。
但请确保使用正确的索引,否则它不会很好地扩展:)
更新:
或者,如果您希望能够用相同的标记来标记这两种产品类型,可以向包含产品组的交叉表中添加另一个字段,并将其添加到多主键中(如mjv;所指出的)。
https://stackoverflow.com/questions/2360629
复制相似问题