外键取决于列内容 - 如何确保完整性?

R K*_*lev 5 database-design entity-relationship foreign-keys relationship database-normalization

简短介绍 - 数据背后的逻辑

我正在研究一个存储实验数据(拉曼光谱)及其元数据的PostgreSQL数据库.除了我们的样品的"正常"光谱之外,还必须获取并保存用于仪器校准目的的特殊光谱.

每次我进行实验时,我都会在表中创建一条新记录measurements,在此我指定measurement type相应的元数据(其他表的外键).

问题是,元数据类型的不同取决于measurement type:

  1. 样品测量 - 我们必须sample_id从表中存储samples
  2. 标准物质 - 在这种情况下,我们指定表中的物质 substances
  3. source_id必须提供特殊标准化光源
  4. 暗帧 - 简单,不需要来自其他表的数据

样品,物质光源具有完全不同的属性,因此我们必须将它们保存在单独的表中,measurements通过外键链接到表中.我认为我的数据在这里有多态关系(如果我错了,请纠正我).

问题

在当前设计中,存储在列measurementtype_id(突出显示为红色)中的值定义必须NULL编辑哪些外键(突出显示为黄色)以及哪些必须包含值.

表关系

在此输入图像描述

我很确定这个设计违反了第三种常规形式.我们可以有一个场景,当错误类型的元数据与测量相关联时.如何确保数据完整性?不幸的是,到目前为止我找不到合理的解决方案......

Chr*_*ers 1

使用 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
 );
Run Code Online (Sandbox Code Playgroud)

这再次解决了您眼前的问题,但稍后会成为维护问题

更好的方法是将相关列分成两个单独的联接表,因为这可以避免这种令人头疼的问题。