【问题标题】:Foreign keys depend on the column content - how to ensure integrity?外键取决于列内容 - 如何确保完整性?
【发布时间】:2016-06-21 06:16:39
【问题描述】:

简介——数据背后的逻辑

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

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

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

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

samplessubstanceslight sources有着完全不同的属性,所以我们必须将它们分别保存在单独的表中,链接到表@ 987654334@ 通过外键。 我认为我的数据在这里有一个多态关系(如果我错了,请纠正我)。

问题

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

Table relationships

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

【问题讨论】:

  • 一个 NF 是一个孤立的表满足或不满足的东西。规范化不处理 NULL。因此,目前尚不清楚您对 3NF 的担忧是什么。 PS Search/google re SQL 子类型化/多态性。
  • 您的 DBMS 是什么?您可以以声明方式编写的约束取决于此。
  • 非常感谢@philipxy!您的搜索关键字帮助我找到了相关信息,我认为我理解了该主题。经过一些研究和测试,我找到了一个类似于this one 的解决方案。它似乎运作良好并且可以满足我的要求。我还测试了 PostgreSQL 继承,但由于issues with foreign keys,它对我不起作用。

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


【解决方案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
 );

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

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

【讨论】:

  • Thangs,这是一个很好的建议。但是,我已经重新设计了数据库并将 measurements 表中的数据拆分为四个表,一个用于每种测量类型,一个主表仅包含常见的元数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
相关资源
最近更新 更多