我正在研究一个存储实验数据(拉曼光谱)及其元数据的PostgreSQL数据库。除了正常的"之外,还有必要。我们的样品光谱,用于获取和保存用于仪器校准目的的特殊光谱。
每次进行实验时,我都会在表measurements
中创建一条新记录,其中我指定measurement type
和相应的元数据(其他表的外键)。
问题是,元数据类型因measurement type
:
sample_id
samples
substances
source_id
样本,物质和光源具有完全不同的属性,因此我们必须将它们保存在单独的表中,并链接到表{ {1}}通过外键。 我认为我的数据在这里有一个多态关系(如果我错了,请纠正我。)
在当前设计中,存储在列measurements
(突出显示为红色)中的值定义了哪些外键(突出显示为黄色)必须为measurementtype_id
ed且哪些必须包含值。
我很确定此设计违反了third normal form。我们可以有一个场景,当错误类型的元数据与测量相关联时。如何确保数据完整性?不幸的是,到目前为止我找不到合理的解决方案......
答案 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
);
这再次解决了您的问题,但后来成为维护问题
更好的方法是将相关列分成两个单独的连接表,因为这样可以避免这种麻烦。