2009-11-23 85 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