2009-09-25 42 views
6

我有活動和照片,然後評論。現在,我有兩張評論表,一張是與事件相關的評論,另一張是照片評論。模式與此類似:當兩張表非常相似時,他們應該何時合併?

CREATE TABLE EventComments 
(
    CommentId int, 
    EventId int, 
    Comment NVarChar(250), 
    DateSubmitted datetime 
) 

CREATE TABLE PhotoComments 
(
    CommentId int, 
    PhotoId int, 
    Comment NVarChar(250), 
    DateSubmitted datetime 
) 

我的問題是,是否我應該將它們合併,並添加一個單獨的交叉引用表,但我不能想辦法做正確。我認爲這應該是好的,你有什麼想法?

編輯

基於Walter的回答(和一些輕讀),我想出了這一點:

CREATE TABLE Comments 
(
    CommentId int, 
    Comment NVarChar(250), 
    DateSubmitted datetime 
    CONTRAINT [PK_Comments] PRIMARY KEY 
    (
    CommentId 
) 
) 

CREATE TABLE EventComments 
(
    CommentId int, 
    EventId int 
) 

CREAT TABLE PhotoComments 
(
    CommentId int, 
    PhotoId int 
) 

ALTER TABLE EventComments ADD CONSTRAINT FK_EventComments FOREIGN KEY (CommentId) REFERENCES Comments(CommentId) 

ALTER TABLE PhotoComments ADD CONSTRAINT FK_PhotoComments FOREIGN KEY (CommentId) REFERENCES Comments(CommentId) 

真的有結構之間的性能差異?對我而言,這似乎有點偏好。我確實在第二個模式中看到了好處,如果我想爲事件註釋或照片註釋添加一些特殊功能,我有一個單獨的表來執行此操作,並且如果我想同時共享一個新的屬性,則有一個表添加新的屬性。

回答

9

評論,PhotoComments和EventComments在一個稱爲「泛化專業化」的模式中相關。這種模式由面嚮對象語言中的簡單繼承來處理。建立一個能夠捕獲相同模式的表格模式會更復雜一些。

但它很好理解。快速谷歌搜索「泛化專業化關係建模」將給你幾個關於這個問題的好文章。

+0

頁面上最好的純設計評論,恕我直言。 – Rap 2009-09-25 16:20:06

+0

我做了一些研究並更新了問題。感謝您的輸入 – scottm 2009-09-25 18:05:26

+0

我非常不同意這個答案;在實踐中,你在乞求不一致的,混亂的數據。如何刪除評論?我經常看到它的設置就像ScottM在修改後的問題中實現的一樣,幾乎總是留言留在評論中,但是EventComments或PhotoComments中的相關記錄被刪除,並且留下了留言中的懸掛記錄。 – JasonFruit 2010-07-21 20:49:20

1

您可以合併它們並添加一個字段,指示它是用於照片還是事件。

您將需要兩個外鍵;一個用於照片,另一個用於事件,但將它們放在一張桌子上,可以讓您編寫一組代碼來處理所有評論。

但我被撕裂。如果你將它們分開,它們會更乾淨,前提是你不需要在同一個列表中混合兩種註釋類型(這需要一個UNION)。

+0

然後,我如何識別評論與哪個照片或事件相關聯,並且仍然確保參照完整性? – scottm 2009-09-25 15:55:12

+0

我同意它的一部分變得更復雜一點。 – 2009-09-25 15:57:23

1

我自己的個人設計風格是結合它們,然後添加一個整數標誌來說明評論的內容。如果我想在稍後添加更多內容,這也會使我具有可擴展性。

4

如果你把它們結合起來,它會弄亂關鍵結構。您將必須具有無效的外鍵或鍵和類型的「軟」鍵結構。我會讓他們分開。

+0

是的,那是我遇到的問題 – scottm 2009-09-25 15:54:18

+1

它們涉及到兩個不同的「實體」我不認爲它們屬於一起 – Gratzy 2009-09-25 15:55:15

+0

雖然它們與不同的實體有關,但它們都是註釋。 – scottm 2009-09-25 15:58:19

相關問題