- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个程序,您可以在其中登记投诉。投诉分为三类:internal
(员工错误),external
(来自另一家公司的错误)和 supplier
(供应商犯的错误)。它们拥有无法共享的不同数据。我目前有 4 个表(投诉、员工、公司和供应商)。这是表格的可视化:
我对子类型有基本的了解,但我似乎无法将它们从 ERD 转换为实际的 SQL Server 数据库,或者至少在这种情况下是这样。这大概是 4 个表的样子(省略了不相关的属性):
投诉
投诉 ID PK
员工
员工 ID PK
员工姓名
公司
公司 ID PK
公司名称
供应商
供应商 ID PK
供应商名称
注册投诉时,错误由 3 种类型中的任何一种产生,并且它们都存储不同的信息。在这种情况下存储信息的最佳方式是什么?我想过在投诉表中加入 2 个鉴别器:ComplaintType
和 Id
所以我可以指出要检查的表和我需要的 Id,但这不是很干净也不是很有效。
请协助。
最佳答案
我强烈建议您不要使用“2 个鉴别器”方法。您将有效地拥有一个指向三个表之一的外键列,具体取决于 ComplaintType 字段。如果您这样做,您将绕过 SQL Server 提供的参照完整性检查以及外键带来的所有好处。在我之前的工作中,有一个名为 EntityTypeIndexLabel 的表,它是一个“桥表”,它将 IndexLabels(基本上是元数据)附加到各种“实体”,这些“实体”是许多不同的潜在表(文档、活页夹、工作流等...)。这简直太可怕了。此表中的 FK 可以指向许多不同的表。孤立的记录可能会随处弹出。必须实现额外的逻辑来确定要加入的表。通常,连接是一种编写的痛苦。这是各种各样的头痛。
我认为你的两个选择是:
投诉中的 -3 列:EmployeeComplaintID、ComplaintID、SupplierComplaintID。 ComplaintIDs 在所有表中应该是唯一的(想想这里的 GUIDs 而不是 IDENTITY 列)。 Complaint 中的每一行将仅填充这些 ID 中的一个,其他两个将为 NULL。然后,您可以在每个查询中在这些表上简单地 LEFT OUTER JOIN 以获取您需要的数据。
- 一张包含每种投诉类型所需的所有可能字段的巨型表,将其他投诉类型的未使用字段设置为 NULL。
关于sql-server - 如何将子类型应用于 SQL Server 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3894056/
我是一名优秀的程序员,十分优秀!