gpt4 book ai didi

sql-server - 如何将子类型应用于 SQL Server 数据库?

转载 作者:行者123 更新时间:2023-12-03 14:34:19 25 4
gpt4 key购买 nike

我正在开发一个程序,您可以在其中登记投诉。投诉分为三类:internal (员工错误),external (来自另一家公司的错误)和 supplier (供应商犯的错误)。它们拥有无法共享的不同数据。我目前有 4 个表(投诉、员工、公司和供应商)。这是表格的可视化:

我对子类型有基本的了解,但我似乎无法将它们从 ERD 转换为实际的 SQL Server 数据库,或者至少在这种情况下是这样。这大概是 4 个表的样子(省略了不相关的属性):

投诉
投诉 ID PK

员工
员工 ID PK
员工姓名

公司
公司 ID PK
公司名称

供应商
供应商 ID PK
供应商名称

注册投诉时,错误由 3 种类型中的任何一种产生,并且它们都存储不同的信息。在这种情况下存储信息的最佳方式是什么?我想过在投诉表中加入 2 个鉴别器:ComplaintTypeId所以我可以指出要检查的表和我需要的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com