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

时间:2016-03-07 15:53:18

标签: database-design foreign-keys relationship entity-relationship database-normalization

简介 - 数据背后的逻辑

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

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

问题是,元数据类型因measurement type

而异
  1. 样本测量 - 我们必须存储表sample_id
  2. 中的samples
  3. 标准物质 - 在这种情况下,我们从表substances
  4. 中指定一种物质
  5. 必须提供特殊标准化光源 - source_id
  6. 暗框 - 简单,无需其他表中的数据
  7. 样本物质光源具有完全不同的属性,因此我们必须将它们保存在单独的表中,并链接到表{ {1}}通过外键。 我认为我的数据在这里有一个多态关系(如果我错了,请纠正我。)

    问题

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

    Table relationships

    enter image description here

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

1 个答案:

答案 0 :(得分: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
 );

这再次解决了您的问题,但后来成为维护问题

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