2009-11-23 72 views
2

我必须在数据库中存储一组相关的关键字。截至目前,我正在考虑使用以下方法:关于用于存储相关关键字的数据库模式的任何建议?

要存储关键字本身:

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) 
); 

这是惯例还是有更好的方法来做到这一点?我所看到的唯一问题是我需要检查两栏以便能够有时获取相关的关键字......我可能会在这里丢失一些东西。

+0

你的意思是添加外键约束关键字1和关键字2,对不对? – Dmitry 2009-11-23 00:05:18

+0

是..对不起......刚更新了我的帖子。忘了那两个声明:)谢谢你指出。 – Legend 2009-11-23 00:08:08

+0

选择更好的列名称,比如'parent_keyword'和'child_keyword',这样关系更明显。此外,虽然“相关”较短,但实际上定义了关键字[sub]分类。 – 2009-11-23 00:47:20

回答

3

如果“相关性”是一对关键字的属性,这个模式是OK(不要忘记加上UNIQUE(关键词1,关键词))

如果“相关性”可以传播一组关键字和一组相关关键字可能会有其他属性,您可能需要在关键字和集合之间添加新表“Related_Set”和M:N关系“Keyword_Set”。

如果一套没有任何额外的属性,你可能只是生活在“Keyword_Set”表

+0

是的,独特是重要的,好点! +1 – 2009-11-23 00:26:14

+0

我将主键定义为*'keyword1'和'keyword2'列(复合)。它不太可能在搜索或使用“id”列 - 这是您永远不会显示给用户的信息,也不会让他们参考。 – 2009-11-23 00:44:41

+0

谢谢。很可能我不会使用相关设置,所以现在简单的设置就足够了。谢谢。 – Legend 2009-11-23 01:20:38

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) 
) 

,因为这是其中一个案件的地方“人造主键”没有什么意义,并且没有实际用处。

+0

谢谢。我会修改那个。 – Legend 2009-11-23 01:19:38

1

有只有一个表中的解决方案 -

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

我认为唯一的问题是相关键超过varchar(400)的情况。但我可能会误解。还有一件事是,在两个表格方法中,我会搜索两列来获取任何关键字的相关关键字。但在这里,我将不得不搜索大量文本来获取其他相关关键字。我想这只是归结为效率:) – Legend 2009-11-23 03:37:04

+0

如果每个关键字有(可以说平均)6个相关的关键字,我们可以在一个选择语句中击中所有6个关键字 - 它避免了需要执行6个选择。它更多的是一个字典数据结构(python-speak),其中每个名称(你的原始关键字)都有一个关联的关键字集合...因此它是一个集合概念 - 不是只有一个元素的集合。 – blispr 2009-11-23 12:23:47