Database design 外键取决于列内容-如何确保完整性? 简短介绍-数据背后的逻辑

Database design 外键取决于列内容-如何确保完整性? 简短介绍-数据背后的逻辑,database-design,foreign-keys,relationship,entity-relationship,database-normalization,Database Design,Foreign Keys,Relationship,Entity Relationship,Database Normalization,我正在开发一个PostgreSQL数据库,该数据库存储实验数据(拉曼光谱)及其元数据。除了样品的“正常”光谱外,还需要获取并保存特殊光谱,以用于仪器校准 每次做实验时,我都在表measurements中创建一个新记录,其中我指定测量类型和相应的元数据(其他表的外键) 问题在于,元数据类型因测量类型的不同而不同: 样本测量–我们必须从表样本中存储样本id 标准物质–在这种情况下,我们从表物质 必须提供特殊标准化光源–光源id 暗框–简单,不需要来自其他表的数据 样品、物质和光源具有完全不同的性质,

我正在开发一个PostgreSQL数据库,该数据库存储实验数据(拉曼光谱)及其元数据。除了样品的“正常”光谱外,还需要获取并保存特殊光谱,以用于仪器校准

每次做实验时,我都在表
measurements
中创建一个新记录,其中我指定
测量类型
和相应的元数据(其他表的外键)

问题在于,元数据类型因测量类型的不同而不同:

  • 样本测量–我们必须从表
    样本中存储
    样本id
  • 标准物质–在这种情况下,我们从表
    物质
  • 必须提供特殊标准化光源–
    光源id
  • 暗框–简单,不需要来自其他表的数据
  • 样品、物质和光源具有完全不同的性质,因此我们必须将它们保存在单独的表中,通过外键链接到表
    测量值
    。
    我认为我的数据在这里有多态关系(如果我错了,请纠正我)

    问题 在当前设计中,列
    measurementtype_id
    (突出显示的红色)中存储的值定义了哪些外键(突出显示的黄色)必须为
    NULL
    ed,哪些外键必须包含值


    我很确定这个设计违反了法律。当错误类型的元数据与度量相关联时,我们可能会遇到这样的情况。如何确保数据的完整性?不幸的是,到目前为止,我还没有找到一个合理的解决方案……

    使用PostgreSQL,您可以使用检查约束。现在,我认为最大的问题是,如果您必须添加更多类型,那么随着时间的推移,维护可能会成为一个问题

    但是,您可以相当轻松地执行以下操作:

    ALTER TABLE measurements ADD
    CHECK((measurementtypeid <> 1 
              OR (... IS NOT NULL ...)) -- CONSTRAINTS FOR TYPE 1
           AND (measurementtypeid <> 2
              OR (....) -- constraints for type 2
           -- etc
     );
    
    ALTER TABLE measurements ADD
    检查((测量类型ID 1
    或(…不为NULL…)--类型1的约束
    和(测量类型ID 2
    或(..)--类型2的约束
    --等
    );
    
    同样,这解决了您当前的问题,但以后会成为维护问题


    更好的方法是将相关列分成两个单独的联接表,因为这样可以避免这种麻烦。

    NF是一个单独的表满足或不满足的东西。规范化不处理空值。因此不清楚您关心的是什么re 3NF.PS Search/google re SQL subtyping/多态性。什么是您的DBMS吗?您可以声明式编写的约束依赖于此。非常感谢@philipxy!您的搜索关键字帮助我找到了相关信息,我想我理解了这个主题。经过一些研究和测试,我找到了类似的解决方案。它似乎工作正常,符合我的要求。我还在Heri中测试了PostgreSQL例如,但由于.Thangs的原因,它对我不起作用。这是一个很好的建议。但是,我已经重新设计了数据库,并将
    度量值
    表中的数据拆分为四个表,每种度量值类型一个,主表只包含公共元数据。