2012-09-11 47 views
1

我正在嘗試創建壁紙共享庫,並且我希望我的訪問者能夠在壁紙和文章上發佈評論。SQL如何引用變量列

比方說,我有如下表:

Wallpaper 
- id 
- name 
- etc... 

Article 
- id 
- title 
- etc... 

Comment 
- id 
- text 

我想評論要關聯到任何一個獨特的牆紙或獨特的文章。

我想過讓繼承這樣的:

Commentable 
- id 

Article 
- id references Commentable.id 
- etc... 

Wallpaper 
- id references Commentable.id 
- etc... 

Comment 
- id 
- commented references commentable.id 

但這種方法看起來很重,而不是真的很好。

我也想過做:

Wallpaper 
- id 
- name 
- etc... 

Article 
- id 
- title 
- etc... 

Comment 
- id 
- commented references either Wallpaper.id or Article.id 

但就沒有辦法知道,如果相關的事情是一個壁紙或一篇文章。

另外我想使用MyISAM而不是InnoDB,因爲我會在5.1 MySQL的免費Web主機服務上進行此操作。

你知道有什麼明確的方法嗎?提前致謝。

編輯:感謝大家的答案。

回答

3

兩個選項:

方案一

Wallpaper 
- id 
- name 

Article 
- id 
- title 

Comment 
- id 
- wallpaper_id <== FK 
- article_id <== FK 

優點:參照完整性
缺點:您需要修改架構上額外的實體類型評論

方案二

Wallpaper 
- id 
- name 

Article 
- id 
- title 

Comment 
- id 
- entity_id <== either a wallpaper id or article id 
- entity_type <== one of 'wallpaper' or 'article' (use lookup table if you wish) 

優點:你不必修改架構上額外的實體類型
缺點評論:無參照完整性(儘管可以通過觸發強制執行)

+0

感謝您的回答。我已經考慮過第一個,但是這會留下NULL的50%(並且如果我有兩個以上的表參考)。 「修改schéma評論」是什麼意思? – Virus721

+0

@ Virus721假設您有一個名爲Story的用戶可以評論的新表。使用選項1,您將不得不修改模式以適應此。與選項2不同。您對使用NULL列有什麼擔憂? – RedFilter

+0

我可以根據需要修改架構,這不是問題。有很多可以通過使用「更清晰」模式可以避免的NULL值的事實聽起來不是很好。我想我會去第二選擇。 – Virus721

1

我會去做一些簡單的事情,比如在評論表中添加一個名爲type的字段,使其成爲Tinyint。然後當存儲評論時,你要麼使0或1,選擇哪個是哪種類型,所以0是否是文章的壁紙。你

1

我會建議增加一個類型字段,以您的評論表。你可以用'ARTICLE'或'WALLPAPER'等字符串填充它,或者創建一個ref表。喜歡的東西:

Type_Ref 
- id 
- desc 

Type_Ref將包含自動遞增的主鍵,牆紙或文章的描述。

然後在您的評論表中,您只需要一個Type_Ref_Id字段和相應的ID。然後,只要你需要添加一個新的類型投票,你可以簡單地添加一個條目到ref表。