他のいくつかの異なるエンティティ タイプに関連付けたい汎用エンティティを持つデータベースを設計するためのアドバイスを探しています。恐ろしいイントロ文、私は知っています...それで例を挙げて説明させてください。
テーブル定義を持つ 2 つの異なるエンティティ Employees と Customers があるとします。
Employees
----------
EmployeeID int PK
FirstName varchar
LastName varchar
... other Employee specific fields
Customers
----------
CustomerID int PK
FirstName varchar
LastName varchar
... other Customer specific fields
より良い設計では、関連するベース テーブルに FirstName と LastName という共通のフィールドを含めることができますが、それは私が苦労している部分ではありません。
ここで、Employees と Customers の Addresses と PhoneNumbers を無制限に格納できるようにしたいと考え、テーブルを定義します。
Addresses
----------
AddressID int PK
AddressLine varchar
City varchar
State varchar
PostalCode varchar
PhoneNumbers
-------------
PhoneNumberID int PK
PhoneNumber varchar
PhoneExtension varchar
次に、Addresses と PhoneNumbers を Employees に関連付ける 2 つの追加テーブル:
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
同様の 2 つのテーブル、CustomerAddresses と CustomerPhoneNumbers は、Addresses と PhoneNumbers を Customers テーブルに関連付けます。上記の EmployeeAddressType のような Addresses および PhoneNumbers の従業員固有または顧客固有の側面も、これらの最後の 4 つのテーブルに含まれます。
インターネットで調べたところ、この設計は Table-Per-Type (TPT) または Table-Per-Subclass (TPS) と呼ばれています。また、ポリモーフィックの利点は魅力的に思えます。たとえば、AddressLine2 を Addresses テーブルに後で追加すると、Employess と Customers の両方が追加の住所行の利点を自動的に得ることができます。
TPT に関するこれらの情報源が指摘している欠点は、クエリ速度が遅く、実装が難しいことです。そして今、アドバイスを求める私のかなり自由な嘆願...
私が考慮していない他の欠点は何ですか?この設計に基づいてアプリケーションを維持および進化させようとすると、どのような問題に遭遇する可能性がありますか? 最後に、上記の設計は、経験豊富なデータベース設計者が使用するものでしょうか?
ありがとう。