Fus*_*ion 11 sql-server subtype supertype
我正在制定一个程序,您可以在其中注册投诉.有三种类型的投诉:( internal员工的错误),external(来自其他公司的supplier错误)和(供应商的错误).它们包含无法共享的不同数据.我目前有4张桌子(投诉,员工,公司和供应商).这是表格的可视化:
我对子类型有基本的了解,但我似乎无法将它们从ERD转换为实际的SQL Server数据库,或者至少在这种情况下.这大致是4个表的外观(省略了不相关的属性):
投诉
ComplaintId PK
Employee
EmployeeId PK
EmployeeName
公司
CompanyId PK
CompanyName
供应
商SupplierId PK
供应商名称
注册投诉时,错误由3种类型中的任何一种产生,它们都存储不同的信息.在这种情况下,存储信息的最佳方法是什么?我曾经想过把2个鉴别的投诉表的:ComplaintType和Id这样我可以指出,以检查其表,我需要什么ID,但不是很干净,也没有效率.
请协助.
mar*_*c_s 18
在这个主题上看到一些非常好的资源:
基本上有三种众所周知的方法:
每个人都有利有弊,在某些情况下闪耀,在其他情况下很糟糕 - 研究资源,看看哪三个最适合你的需求.
小智 4
我强烈建议您不要使用“2 个鉴别器”方法。您实际上将拥有一个指向三个表之一的外键列,具体取决于 ComplaintType 字段。如果这样做,您将绕过 SQL Server 提供的引用完整性检查以及外键带来的所有好处。在我之前的工作中,有一个名为 EntityTypeIndexLabel 的表,它是一个“桥接表”,它将 IndexLabels(基本上是元数据)附加到各种“实体”,这些“实体”是许多不同的潜在表(文档、活页夹、工作流等)。这简直太糟糕了。该表中的 FK 可以指向许多不同的表。孤立的记录可能随处出现。必须实现额外的逻辑来确定要加入哪个表。一般来说,编写联接是一件很痛苦的事情。真是各种头痛。
我认为你的两个选择是:
-投诉中有 3 列:EmployeeComplaintID、CompanyComplaintID、SupplierComplaintID。ComplaintID 在所有表中应该是唯一的(此处考虑 GUID,而不是 IDENTITY 列)。投诉中的每一行将仅填充这些 ID 之一,另外两个将为 NULL。然后,您可以在每个查询中简单地对这些表进行 LEFT OUTER JOIN 来获取所需的数据。
- 一个巨大的表,其中包含每种投诉类型所需的所有可能字段,将其他投诉类型的未使用字段设置为 NULL。