2010-08-27 55 views
4

我有很多表:客戶,潛在客戶,朋友..
他們都有一些註釋。實現許多實體的Notes表的最佳方式SQL中的表

問題1: 我是否應該有一個與所有父表共享的Notes表。

我應該有一個NotesCustomer,NotesProspects,NotesFriends表嗎?

問題2:
如果最好的解決方案是第一個,那麼這個一般的Notes表應該有一個FK到父表,但也是父表的類型?

我使用的EntityFramework,但這個問題也一般我猜...

感謝 喬恩

回答

1

第一個選項是最好的註釋表與所有的人分享。

可以使用兩個字段notes_obj_id和notes_obj_type實現表一般注意事項

+0

2個答案(菲爾和ritesh)正好說相反! – John 2010-08-27 13:28:42

+0

等一天,看看upvotes說什麼。 – 2010-08-27 13:54:40

+0

(8月30日)我休息我的情況。 – 2010-08-30 14:04:23

6

第一個選項,爲潛在客戶,客戶和朋友們的獨特表的注意事項,可能是一個清晰的解決方案。

如果您使用一般筆記表,您需要有三個可爲空的FK列來確定FK屬於哪個相關表,並且每行只填充其中一個。

一般而言,良好的關係模型的目標不是(或不一定)將類似數據存儲在一起,而只存儲一次特定數據。所以在設計這個問題時問自己一個很好的問題是「我將所有筆記存儲在同一個表中,從而獲得了什麼?」

+1

+1會提出相反的建議,但「良好的關係模型的目標不是(或不一定)將數據存儲在一起,而是隻存儲一次特定數據」讓我想到了 – Nicolas78 2010-08-27 13:31:37

+4

+1。我曾經做過單筆記表類型的事情,而且我再次做得很慢。我認爲它爲我節省的最大的東西是在我的SQL腳本中創建更少的表,這對於事情的方案來說並不是什麼大不了的事情,事實證明,這是一個痛苦的工作。 – joelt 2010-08-27 13:33:40

+0

是的,我同意。這只是我要求社區的確認,我得到了兩個對立的答案...... – John 2010-08-27 13:33:59

0

我會直覺地喜歡一個表的方法,但它也有它的缺點。 Pro one-table:如果您需要更改其結構,則創建具有相同結構的多個表格可能會很痛苦。此外,只要您查詢註釋而不是邏輯上更簡潔的「type」參數,就必須爲表名添加一個變量。但是,菲爾的觀點也很有趣。您也可能發現單表佈局可能最終會導致只能使用SQL無法輕鬆查詢的數據庫。如果您要獲取大量數據,使用不同的表格也會帶來速度差異。

嗯。一個非常乾淨但也有點複雜的解決方案是創建一個表NotableObject。然後給每個客戶,潛在客戶,任何字段「NotableObjectID」,並將註釋鏈接到NotableObjects,而不是客戶或潛在客戶。當然,如果你想要「給我所有的客戶注意事項」這樣的話,這會使事情變得複雜化,因爲你明確地只存儲客戶提供的信息而不是反向的信息,但是因爲大多數時候你會遇到更像「給我這個客戶的所有筆記「,你可能會沒事的。

0

您應該只有一個Notes表。關係從Notes流向其他實體(它是0:M),因此不需要在Notes表級別具有FK列。在Notes表上,向展望,客戶,朋友提供的FK列只會導致一個設計,在每次新實體需要Notes時都需要不斷添加FK列到Notes表中(並且這並不能真正加快速度) 。

E.g.如果你想獲得的所有展望筆記列表,只需要查詢的展望臺,並使用一個連接,如果你必須得到說明詳細介紹:

select n.NoteId, n.NotesDetail from Prospect p inner join Notes n 
    on p.NoteId = n.NoteId 

你的注意事項表可能類似於此:

create table Notes 
(
    NoteId int identity(1,1) 
    ,NotesDetail varchar(max) 
    // ... any other fields related to the Notes entity.... 
) 

在其他表上,您只需要一個字段FK鏈接到Notes表上的NoteId。

+1

如果每個相關實體需要多個註釋,則不需要。如果每個實體需要一個音符,則沒有理由首先有單獨的Notes音符表。 – 2010-08-27 15:45:28

+0

@Phil,同意,如果每個實體有多個註釋,則需要一個連接表。我不同意通過非規範化連接表來實際包含註釋。 – code4life 2010-08-27 16:31:21

+1

我的意思是:如果每個實體只有0-1個註釋,則只需將註釋存儲在主實體表中,不需要額外的表。 IOW,客戶表將會有一個名爲「Note」的列。我不清楚你的反規範化連接表的含義。 – 2010-08-27 17:49:21

0

我意識到這是舊的,但..

這將允許多個筆記。

select n.NoteId, n.NotesDetail from Prospect p inner join Notes n 
on n.EntityId = p.id AND n.EntityType ='prospect' 
相關問題