1

我们有一个 SQL Server 数据库设计时场景……我们必须在我们的数据库中存储有关不同组织的数据(例如,客户、供应商、分销商……)。所有 diff 组织共享相同类型的信息(几乎).. 例如地址详细信息等...并且它们将在其他表中引用(即通过 OrgId 链接,我们必须在许多 diff 位置查找 OrgName)

我看到两个选项:

  1. 我们为每个组织创建一个表,例如 OrgCustomer、OrgDistributor、OrgVendor 等……所有表都将具有相似的结构,并且某些表将具有额外的特殊字段,例如客户具有字段 HomeAddress(其他 Org 表没有) ) .. 反之亦然。

  2. 我们创建一个通用 OrgMaster 表并将所有 diff Orgs 存储在一个地方。该表将有一个 OrgType 字段来区分 Orgs 的不同类型。并且特殊字段将附加到 OrgMaster 表中(只有相关的 Org 记录才会在这些字段中具有值,在其他情况下它将为 NULL)

#1的一些优点和缺点:

优点:

  • 它有助于在访问不同类型的 Org 数据时分配负载,因此我相信这可以提高性能。
  • 在不影响其他现有 Org 类型的情况下,提供自定义任何特定 Org 表的完整范围。
  • 不确定差异/分布式表上的差异索引是否比单个大表更好。

缺点:

  • 复制设计。如果我必须增加 ZipCode 字段的大小 - 我必须在所有表格中这样做。
  • 操作实现中的复制(即,我们已将存储过程用于 CRUD 操作,因此复制进行 n 倍 .. 3-4 Inert SP、2-3 SELECT SP 等...)
  • 从 DB 约束\索引到 SP 到应用程序代码中的业务对象,一切都增长了 n 倍。
  • 一个地方的改变(共同)也必须在所有其他地方进行。

#2的一些优点和缺点:

优点:

  • N倍变成1倍:-)
  • 维护变得容易,因为我们可以尝试为所有操作实现单个入口点(即单个 SP 来处理 CRUD 操作等)
  • 我们不得不担心维护一个表。索引和其他优化仅限于单个表。

缺点:

  • 它会造成瓶颈吗?是否可以通过实施视图和其他优化的数据访问策略来管理?
  • 集中实施的另一面是必须在所有地方测试和验证单个更改。它不是抽象的。
  • 该设计可能看起来不那么“有条理\结构化”,尤其是。由于我们需要为其添加“特殊”字段的少数组织(与其他表无关)

我还想到了一个选项#3 - 将 Org 表分开,但创建一个通用 OrgAddress 表来存储通用字段。但这让我处于#1 和#2 的中间,它造成了更多的混乱!

老实说,我是一位经验丰富的程序员,但不是同样经验丰富的 DBA,因为这不是我的主要工作,所以请帮助我在设计复杂性和性能等参数之间做出正确的权衡。

提前致谢。欢迎提出任何技术问题和建议。

赫曼

4

2 回答 2

1

我研究过实现了您所有选项的各种应用程序。老实说,您可能需要考虑用户使用数据的方式、您期望的记录数、共性(具有多种功能的同一组织)以及您期望的记录更新级别。

选项 1 在通用性很少的应用程序中运行良好。我已经在一个应用程序中使用了你的选项 3,其中有更多的共性,并且不太喜欢它(一直需要更多的工作来从不同的层获取数据)。因此,此应用程序的重写正在实施您的选项 2。

高温高压

于 2009-10-26T12:36:35.033 回答
1

我想说你的第二个选项很接近,只有几点:

客户、分销商、供应商是组织的类型,所以我建议:

  1. 表 [Organization],其中包含所有组织共有的所有列和行的主键。

  2. 将表 [Vendor]、[Customer]、[Distributor] 与每个表的特定列和 FK 到 [Organization] 行 PK 分开。

听起来像是“超类型/子类型关系”。

org_model_01

于 2009-10-26T20:41:38.877 回答