【发布时间】:2013-04-20 21:58:39
【问题描述】:
我正在寻求有关设计数据库的建议,该数据库具有希望与其他几种不同实体类型相关的通用实体。可怕的介绍句,我知道……所以请让我举例说明。
考虑我有两个不同的实体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 的消息来源指出的缺点是查询速度较慢且难以实施。现在我相当开放式的请求建议......
我没有考虑哪些其他缺点?您在尝试维护和改进基于此设计的应用程序时会遇到什么问题?最后,上面的设计是大多数有经验的数据库设计师会使用的吗?
谢谢。
【问题讨论】:
标签: sql database database-design