我正在尋找設計具有通用實體的數據庫的建議,這些通用實體要與多種不同的其他實體類型相關。可怕的介紹句子,我知道......所以請讓我以身作則。按表類型的數據庫設計建議
想想看,我有兩個不同的實體員工和客戶提供表DEFS:
Employees
----------
EmployeeID int PK
FirstName varchar
LastName varchar
... other Employee specific fields
Customers
----------
CustomerID int PK
FirstName varchar
LastName varchar
... other Customer specific fields
更好的設計可能具有共同的領域,名字和姓氏,在相關基本表,但是這不是一部分,我正在掙扎。現在
,考慮到我希望能夠存儲地址和PHONENUMBERS我的員工和客戶的數量不受限制,並定義表:
Addresses
----------
AddressID int PK
AddressLine varchar
City varchar
State varchar
PostalCode varchar
PhoneNumbers
-------------
PhoneNumberID int PK
PhoneNumber varchar
PhoneExtension varchar
然後另外兩個表,相關地址和PHONENUMBERS對員工:
EmployeeAddresses
------------------
EmployeeAddressID int PK
EmployeeID int FK Employees.EmployeeID
AddressID int FK Addresses.AddressID
EmployeeAddressType enum
EmployeePhoneNumbers
---------------------
EmployeePhoneNumberID int PK
EmployeeID int FK Employees.EmployeeID
PhoneNumberID int FK PhoneNumbers.PhoneNumberID
EmployeePhoneNumberType enum
和兩個類似的表,CustomerAddresses和CustomerPhoneNumbers,對相關地址和PHONENUMBERS到Customers表。地址和電話號碼的任何員工特定或客戶特定方面(如上面的EmployeeAddressType)也位於最後四個表中。從我發現研究互聯網的角度來看,這種設計被稱爲按表格類型(TPT)或每個子類別表格(TPS)。多態優勢看起來很吸引人,例如,我可以將AddressLine2添加到地址表中,我的企業和客戶都會自動獲得額外地址行的好處。
這些TPT提供的缺點是查詢速度慢,難以實現。而現在我的相當開放式呼籲建議......
我還沒有考慮其他缺點嗎?您可以嘗試基於此設計來維護和發展應用程序?最後,最有經驗的數據庫設計師會使用上述設計嗎?
謝謝。
感謝您的回覆。是的,班級表繼承聽起來更像我想的。看到我對HLGEM的迴應 - 我們直接向人們提供地址的問題在於,我有專門針對每個人的子類的地址專門化。 – splouie 2013-04-29 14:39:46
如果您認爲這是正確的答案,即使您沒有獲得上傳的權利,也可以將其標記爲正確。 – 2013-04-29 19:39:17
啊哈!將此響應標記爲正確,因爲它命名數據建模方法 - 類表繼承。此外,與HLGEM的這一建模策略相一致的是良好的信息和建議。感謝大家的反饋。 – splouie 2013-04-29 20:28:06