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