在医疗领域,患者有大量的检查(HbA1C,脂质,肾脏等),它们基本上都遵循ExamX的格式(ID,ID_Patient,日期,价值)
但是你可以使用SuperExam(ID,ID_Patient,ExamType,Date,Value)从多个表转到一个
注意,第二个表中的值不是离散的。有些考试有多个值,因此需要对它们进行分隔。 Ex值= .9,105,108,.4
我通常使用第一种格式,但我也见过第二种结构。我想在第二个版本中,您可以更灵活地使用数据而无需更改数据库架构,但似乎报告将是一场噩梦。
哪种设计更好?
答案 0 :(得分:4)
请注意,打包具有多个值的单个字段(例如逗号分隔列表)违反了第一个普通形式规则(特别是它没有重复的组)。
任何不是第一范式的数据库设计都是值得怀疑的。通常,经验法则是通过非规范化来设计正常形式,优化性能和偶然的方便性。
有一个共同的表格考试(ExamId,ExamType,PatientId,OccurredOn)然后特定的相关表格RenalExamination(ExamId,Rate,Hue),LipidExamination(ExamId,LCount,YCount)等可能是更好的选择。
这实际上取决于你在做什么。如果这是医学实验应用的核心,则需要更多的设计工作。当然,我的目标是规范数据库,然后“向后工作”。
答案 1 :(得分:3)
哎哟。另一个新的从零开始的医学考试数据库设计。
从经验来看,比你描述的更加微妙和复杂。
示例:只是血压有两个测量值(至少),收缩压和舒张压。
示例:通常同时进行许多测试;它们的意义来自于测量之间的相互关系(以及背景信息和文本解释)。
请做一些研究,找到一个至少可以从中开始的现有设计。
答案 2 :(得分:1)
很可能你将不得不采取EAV方法(如另一个答案中所述)并创建一个数据字典。然后,您不仅可以存储考试的特定数据,还可以使用表格结构来存储定义考试中数据的数据(考试模板,值之间的关系等)。您基本上使用RDBMS的关系方面来创建自己的关系系统。
这听起来很复杂 - 在某种程度上,虽然没有看起来那么多 - 但如果你打算让这个医疗系统具有可扩展性和可维护性,那么从长远来看这是值得的。
不要在一列中存储多个值。永远。无论如何。
这是一个简单的例子......
exam:
exam id,
date,
patient id,
...other miscellaneous scalar data thats 1-1 with an exam
exam value:
exam value id,
exam id,
value id,
value
这是用于存储考试数据的BASIC结构。那你就......
value:
value id,
description
group:
group id,
description
group value:
group value id,
group id,
value id,
sort order
同样,非常基本和简陋,但希望能让你一瞥我正在谈论的内容。您可能希望更进一步,定义具有特定组的特定考试类型,然后将考试类型分配给考试,但我会将其留给您。
答案 3 :(得分:0)
我会说#2。你可以简单地通过添加“where ExamType = X”条件将其转换为#1,并且更容易进行跨多个考试的查询(例如,“向我展示患者鲍勃的所有考试”),否则需要一堆工会(你已经提到了灵活性)
编辑:oops我误解了这个问题。不要做逗号分隔值之类的事情。 (“我不需要创建2个表,因为JOINS很昂贵”不是一个有效的理由。)答案 4 :(得分:0)
第二种形式实际上更灵活,因为您不必为新类型的考试创建新表格;相反,您只需在Exams表中添加另一行。
那就是说,你仍然有一个考试的多个价值问题。您可以将SuperExam表拆分为两个:而不是使用分隔值,一个用于在特定日期将患者与检查联系起来,另一个用于为每个事件提供所有值,每行一个。这称为“标准化”。对于临时查询,您可以使用JOIN
子句将其重新组合在一起。
答案 5 :(得分:0)
你的直觉是正确的。 “SuperExam表”称为实体 - 属性 - 值数据库,通常用于临床记录,其中稀疏数据与单个实体相关联。
E-A-V表易于搜索。问题是找不到行,它找到相关的行。
为不同的实体提供不同的表提供了域建模,但它们也提供了弱形式的元数据。在E-A-V中没有这样的抽象。 (Java类似于E-A-V将声明所有函数的形式参数都是Object类型 - 所以你不会进行类型检查。)
我们可以轻松查找属性键,但没有对这些属性键进行分组。没有办法将所有血液测试结合在一起,或者将血液测试与体重区分开来。
一个折衷方案是使用EAV,并将examtype作为另一个表的外键,以提供更多关于考试类型的数据和/或分组。
维基百科有一篇关于E-A-V的非常好的文章,但现在读它 - 它主要是一位作者的作品,并且是为了“改进”。
答案 6 :(得分:-1)
我可以建议#3 ......它需要#2并扩展它......
带上您的SuperExamTable并获得ExamType和Value。创建一个名为ExamDetail的新表,其中包含以下值:ExamDetailId,SuperExamId,ExamType和Value
这将允许患者在具有多种检查类型和值的特定日期进行检查。