我正在寻找有关设计具有要与其他几种不同实体类型相关的通用实体的数据库的建议。可怕的介绍句,我知道……所以请让我举例说明。
考虑到我有两个不同的实体Employees 和Customers 表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
更好的设计可能在相关的基表中包含公共字段 FirstName 和 LastName,但这不是我正在努力解决的部分。
现在,考虑我希望能够为我的员工和客户存储无限数量的地址和电话号码,并定义表:
Addresses
----------
AddressID int PK
AddressLine varchar
City varchar
State varchar
PostalCode varchar
PhoneNumbers
-------------
PhoneNumberID int PK
PhoneNumber varchar
PhoneExtension varchar
然后是另外两个表格,将地址和电话号码与员工联系起来:
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,用于将 Addresses 和 PhoneNumbers 关联到 Customers 表。Addresses 和 PhoneNumbers 的任何特定于员工或特定于客户的方面,例如上面的 EmployeeAddressType,也在最后四个表中。
根据我对 Internet 的研究,这种设计称为 Table-Per-Type (TPT) 或 Table-Per-Subclass (TPS)。并且多态优势似乎很有吸引力,例如,我可以将 AddressLine2 添加到 Addresses 表中,我的 Employess 和 Customers 都会自动获得额外地址行的好处。
这些关于 TPT 的消息来源指出的缺点是查询速度较慢且难以实现。现在我相当开放的征求意见...
我没有考虑其他哪些缺点?您在尝试维护和改进基于此设计的应用程序时会遇到什么问题?最后,上面的设计是大多数有经验的数据库设计师会使用的吗?
谢谢。