【发布时间】:2016-06-21 06:16:39
【问题描述】:
简介——数据背后的逻辑
我正在研究存储实验数据(拉曼光谱)及其元数据的 PostgreSQL 数据库。除了我们样品的“正常”光谱外,还有必要获取和保存特殊光谱以用于仪器校准。
每次我进行实验时,我都会在表 measurements 中创建一条新记录,并在其中指定 measurement type 和相应的元数据(其他表的外键)。
问题在于,元数据类型因measurement type 的不同而不同:
- 样品测量——我们必须从表
samples中存储sample_id - 标准物质——在这种情况下,我们从表
substances中指定一种物质 - 特殊标准光源 - 必须提供
source_id - 暗框 - 简单,不需要其他表中的数据
samples、substances和light sources有着完全不同的属性,所以我们必须将它们分别保存在单独的表中,链接到表@ 987654334@ 通过外键。 我认为我的数据在这里有一个多态关系(如果我错了,请纠正我)。
问题
在当前设计中,存储在列measurementtype_id(红色突出显示)中的值定义了哪些外键(黄色突出显示)必须为NULLed,哪些必须包含值。
我很确定这种设计违反了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