将地址表链接到多个其他表

spo*_*cky 6 sql-server database-design database-schema

我被要求向我们的数据库(SQL Server 2012)添加一个新的地址簿表。

为了简化数据库的相关部分,存在三个表,每个表以一对多的方式相互链接: 公司(有许多) 产品(有许多) 项目 其想法是一个或多个地址将能够存在在这些级别中的任何一个级别。我们的想法是,在前端系统中,用户将能够查看和选择他们指定的项目的特定地址以及与其父产品和公司相关的更通用的地址。现在的问题是如何最好地在数据库中对此进行建模。

到目前为止,我已经想到了两种可能的想法,所以想知道是否有人有类似的关系来为自己建模以及他们如何实现它?

想法一: 新的地址表将额外包含三个字段:companyID、productID和projectID。这些字段将与相关表相关,并且可以为空以表示公司和产品级别地址。例如,companyID 2、productID 1、projectID NULL 是产品级别地址。我的问题是,我将关系信息存储在表中,因此如果项目更改为与不同的产品相关,则该表中的数据将不正确。我可能可以将除我感兴趣的级别之外的所有级别都设为 NULL,但这将使获取父地址变得有点困难

想法二: 在地址表上有一个typeID和一个genericID。genericID 可以包含来自公司、产品和项目表的 ID,其中 typeID 确定它来自哪个表。我有点困惑如何设置必要的约束来做到这一点,并且想知道将来这是否会变得棘手

非常感谢,

Moh*_*ari 2

我建议使用想法一并防止想法二。

第二个想法称为多态关联反模式
目标:引用多个父项
产生的副作用:使用双用途外键将违反第一范式(原子问题),失去引用完整性
解决方案:简化关系

关系的简化可以通过两种方式获得:

  • 拥有多个可为空的锻造键(想法 1):如果使用关系的表(产品、项目等)有限,那么这将是简单且适用的。(想想当他们长大了更多)
  • 另一个更通用的解决方案是使用继承。定义一个新实体作为(产品、项目……)的基表以满足可寻址性。也许命名为“组织单位”更合理一些。该organization_unit 表的主键将是(产品、项目...)的主键。其他集合(如地址、图像、合同...表)将与此基表相关。 在此输入图像描述