我被要求在我们的数据库中添加一个新的地址簿表(SQL Server 2012)。
为了简化数据库的相关部分,有三个表,每个表以一对多的方式相互链接:公司(有很多)产品(有很多)项目,并且想法是一个或多个地址将是能够存在于这些级别中的任何一个级别。我们的想法是,在前端系统中,用户将能够查看和选择他们指定的项目的特定地址以及与其父产品和公司相关的更多通用地址。 现在的问题是如何在数据库中对此进行建模。
到目前为止,我已经想到了两个可能的想法,所以想知道是否有人有类似的关系模型本身以及如何实现它?
创意一: 新地址表还包含三个字段:companyID,productID和projectID。这些字段将与相关表相关,并且可以为空,以表示公司和产品级地址。例如companyID 2,productID 1,projectID NULL是产品级地址。 我的问题是我将关系信息存储在表中,因此如果项目被更改为与不同的产品相关,则此表中的数据将不正确。除了我感兴趣的关卡之外,我可能只剩下NULL,但这会让父地址变得更难获得
理念二: 在地址表上有一个typeID和一个genericID。 genericID可以包含Company,Product和Project表中的ID,typeID确定它来自哪个表。我有点担心如何设置必要的约束来做到这一点,并想知道将来是否会变得棘手处理
非常感谢,
答案 0 :(得分:2)
我建议使用Idea one并防止Idea 2。
第二个想法被称为Polymorphic Association反模式
目标:参考多个父母
产生的副作用:使用两用外键会违反第一范式(原子问题),失去参照完整性
解决方案:简化关系
关系的简化可以通过两种方式获得:
答案 1 :(得分:0)
听起来你可以使用连接表http://en.wikipedia.org/wiki/Junction_table。 它们将为您提供维护外键约束所需的灵活性,以及在需要时在级别或实体之间共享地址。
一个用于Company_Address,Product_Address和Project_Address