【问题标题】:Any suggestions for a db schema for storing related keywords?对于存储相关关键字的数据库模式有什么建议吗?
【发布时间】:2009-11-23 00:03:18
【问题描述】:

我必须在数据库中存储一组相关的关键字。截至目前,我正在考虑使用以下内容:

存储关键字本身:

CREATE TABLE keywords(
   id int(11) AUTO_INCREMENT PRIMARY KEY,
   word VARCHAR(255)
);

存储关系(存储相关关键字的id):

CREATE TABLE relatedkeywords(
   id int(11) AUTO_INCREMENT PRIMARY KEY,
   keyword1 int(11),
   keyword2 int(11),
   FOREIGN KEY (keyword1) REFERENCES keywords(id),
   FOREIGN KEY (keyword2) REFERENCES keywords(id)
);

这是惯例还是有更好的方法?我看到的唯一问题是我需要检查这两个列,以便有时能够获得相关的关键字......我可能在这里遗漏了一些东西。

【问题讨论】:

  • 你的意思是给keyword1和keyword2添加FOREIGN KEY约束,对吧?
  • 是的..对不起...刚刚更新了我的帖子。忘了这两个陈述:) 感谢您指出这一点。
  • 选择更好的列名,比如parent_keywordchild_keyword,这样关系就更明显了。此外,虽然“相关”更短,但您实际上是在定义关键字 [子] 分类。
  • 谢谢,我会改的。

标签: mysql database-design keyword


【解决方案1】:

如果“相关性”是一对关键字的属性,这个模式是可以的(别忘了加上UNIQUE(keyword1,keyword2))

如果“相关性”可以传播一组关键字并且一组相关关键字可能具有附加属性,您可能需要添加一个新表“Related_Set”以及关键字和集合之间的 M:N 关系“Keyword_Set”。

如果一个集合没有任何额外的属性,你可以只使用“Keyword_Set”表

【讨论】:

  • 我将主键定义为 both keyword1keyword2 列(复合)。不太可能搜索或使用 id 列 - 这是您永远不会向用户显示或让他们参考的信息。
  • 谢谢。很可能我不会使用相关集,所以现在简单的集就足够了。谢谢。
【解决方案2】:

将第二个表简化为:

CREATE TABLE relatedkeywords(
   keyword1 int(11),
   keyword2 int(11),
   FOREIGN KEY (keyword1) REFERENCES keywords(id),
   FOREIGN KEY (keyword2) REFERENCES keywords(id),
   PRIMARY KEY (keyword1, keyword2)
)

因为这是“人工主键”毫无意义且没有实际用途的情况之一。

【讨论】:

    【解决方案3】:

    有没有只有一张桌子的解决方案 -

    create table keywords (
       keywrd varchar (40) not null primary key,
       related_keys_csv varchar(400)  
    )
    

    【讨论】:

    • 我认为唯一的问题是相关键超过 varchar(400) 的情况。不过我可能弄错了。还有一件事是,在两表方法中,我会搜索两列以获取任何关键字的相关关键字。但是在这里,我将不得不搜索大量文本来获取其他相关关键字。我想这最终归结为效率:)
    • 如果每个关键字(平均而言)有 6 个相关关键字,我们可以在一个 select 语句中命中所有 6 个关键字 - 它避免了执行 6 个选择的需要。它更像是一个字典数据结构(python-speak),其中每个名称(您的原始关键字)都有一个相关关键字的关联集合......因此它是一个集合概念 - 而不是只有一个元素的集合。
    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多