2011-04-10 54 views
1

在發佈此問題之前我做了搜索,沒有發現任何直接相關的東西,所以如果這是重複的,我會道歉。我正在設計一個業務系統,就像任何業務系統一樣,我有一個帶CustomerID PK Identity列的Customers表。在規範化設計中處理主要通信記錄的最佳方法

我正在處理電話號碼/電子郵件地址表,我希望通過這種方式對任何給定的客戶ID可以有多個電話號碼和/或電子郵件地址進行規範化。大多數企業將爲任何一個人的賬戶關聯一個電話號碼並將其稱爲主要電話號碼。這個電話號碼可能是在任何陳述,報告等上顯示的電話號碼。與電子郵件地址相同。

我開始考慮如果我想要通過主要電話和電子郵件地址獲取客戶列表,SELECT查詢將如何工作。顯然,我可以使用Inner Join檢索信息,但我只希望每個CustomerID出現一次,如果一個CustomerID有兩個電話號碼,那麼他們會在列表中顯示兩次。

所以我最初的想法是創建一個名爲CustomerCommunications的表,並存儲電話號碼和電子郵件地址,並在其中添加FlagPrimary列,但這不太合理,因爲如果一條記錄是電話號碼或電子郵件地址。 (很明顯,內容會讓它消失,但從查詢的角度來看,這將是具有挑戰性的)。所以我想爲主要電話和主要電子郵件添加一個CommunicationTypes表和單獨的行。然後在CustomerCommunications表中添加一個名爲CommunicationTypeID的外鍵,這將允許我輕鬆識別哪個是主要電話,哪個是主要電子郵件。但後來我開始考慮其他電話和電子郵件地址記錄的CommunicationTypeID。只是電話和電子郵件?輔助電話和電子郵件?

很明顯,這個問題是主觀的,並受制於自己的設計理念,但基本上我在尋找的是其他人在使用1到多表時想到的想法,但希望能夠輕鬆地單列出一行用於顯示或報告目的。

+0

作爲國旗的主要是好的。爲什麼有人不能有多個電子郵件地址?我做。 – 2011-04-10 01:56:13

+0

我會設置它,以便他們可以輸入多個電子郵件地址,但大多數情況下當您註冊任何類型的網站時,您通常會將它們放在一個電子郵件地址中,這就是他們將如何與您聯繫。 – Jeremie 2011-04-10 02:51:30

回答

1

首先,您可能想考慮將電子郵件地址和電話號碼保留在單獨的表格中。根據你的觀點,他們有不同的屬性和目的。如果您將它們放在一張表中,那麼您應該有一個分區屬性來區分信息是電話號碼還是電子郵件地址。如果您使用代碼作爲您的分區屬性,那麼您可以選擇在需要時再添加其他通信類型。

如果您的業務規則是隻有一個電話號碼和一個地址可以是主要電話號碼,並且他們可以擁有儘可能多的其他電話號碼,那麼使用數據庫模式強制執行此操作的方式是將外鍵在顧客名單上指出主要聯繫人。這意味着您的PHONE_NUMBER表具有FK到CUSTOMER,而且CUSTOMER具有FK到PHONE_NUMBER(例如primary_phone_number_id)。電子郵件也是如此。如果您將電子郵件和電話號碼混合在同一張表中,您仍然需要一個觸發器或其他程序邏輯來確保您指向每個客戶的一個電話號碼和一封電子郵件。這是將您的不同聯繫人類型分解到他們自己的表格的另一個優點。 FK可以完成所有繁重的工作,並且不存在任何可能容易出錯的過程代碼。

+0

因此,而不是添加一個FlagPrimary列到CustomerPhones表中添加一列到客戶表名爲PrimaryPhoneID這是一個FK到CustomerPhones的PK?這同樣適用於電子郵件嗎?我真正同意的設計電子郵件和電話號碼是具有各自屬性的獨立實體。我正在考慮通過在通信實體上進行簡化。 – Jeremie 2011-04-10 02:56:21

+0

簡化取決於你如何看待它。有一張表而不是兩張表似乎比較簡單,但有一張表必須以不同的方式處理記錄(不同的編輯,在不同的輸出中使用等)意味着你在過程邏輯中有更多的複雜性,所以在兩張表之後可能更簡單所有。 – 2011-04-11 12:25:09