Database design 医疗价值:1张超级检查表或大量检查表

Database design 医疗价值:1张超级检查表或大量检查表,database-design,Database Design,在医学领域,患者有大量的检查(糖化血红蛋白、血脂、肾脏等),基本上都遵循ExamX的格式(ID、ID_患者、日期、值) 但是您可以使用SuperExam(ID、ID\u Patient、ExamType、日期、值)从多个表转到一个表 注意,第二个表中的值不是离散的。有些考试有多个值,因此需要对它们进行分隔。Ex值=.9105108.4 我通常使用第一种格式,但我也多次看到第二种结构。我想使用第二个版本,您可以在不必更改db模式的情况下更灵活地处理数据,但报告似乎是一场噩梦 哪个设计更好?我想说#

在医学领域,患者有大量的检查(糖化血红蛋白、血脂、肾脏等),基本上都遵循ExamX的格式(ID、ID_患者、日期、值)

但是您可以使用SuperExam(ID、ID\u Patient、ExamType、日期、值)从多个表转到一个表

注意,第二个表中的值不是离散的。有些考试有多个值,因此需要对它们进行分隔。Ex值=.9105108.4

我通常使用第一种格式,但我也多次看到第二种结构。我想使用第二个版本,您可以在不必更改db模式的情况下更灵活地处理数据,但报告似乎是一场噩梦

哪个设计更好?

我想说#2。只需添加一个“where ExamType=X”条件,就可以将其转换为#1,而且更容易进行跨多个检查的查询(例如,“显示患者Bob的所有检查”),否则需要一系列联合(您已经提到了灵活性)


编辑:哎呀,我误解了这个问题。不要做逗号分隔值之类的事情。(“我不必创建两个表,因为联接很昂贵”不是一个合理的理由。)

第二种形式实际上更灵活,因为您不必为新类型的考试创建新表;相反,您只需将另一行添加到考试表中


也就是说,您仍然存在一次考试中出现多个值的问题。不使用分隔值,您可以将SuperExam表拆分为两个:一个用于在特定日期将患者与检查链接,另一个用于提供每个事件的所有值,每行一个。这被称为“规范化”。对于临时查询,您可以使用
JOIN
子句将其重新组合起来。

我可以建议使用一种#3。。。它需要#2并扩展它

带上您的SuperExamTable,了解ExamType和Value。创建一个名为ExamDetail的新表,该表具有以下值:ExamDetailId、SuperExamId、ExamType和Value


这将允许患者在特定日期进行检查,可以有多种检查类型和值

请注意,将单个字段与多个值(例如逗号分隔的列表)打包违反了第一个标准格式规则(特别是它不能没有重复的组)

任何不是第一范式的数据库设计都是相当可疑的。一般来说,经验法则是通过非规范化设计为标准形式、优化性能和偶尔的方便性

有一个共同的检查表(ExamId、ExamType、PatientId、OccurredOn),然后有一个具体的相关检查表——复胺(ExamId、Rate、Hue)、脂质检查(ExamId、LCount、YCount)等,可能是更好的选择


这真的取决于你在做什么。如果这是医学实验室应用程序的核心,那么需要进行更多的设计工作。当然,我的目标是建立一个规范化的数据库,然后“向后工作”。另一个全新的从头开始的医疗检查数据库设计

从经验来看,这里比你描述的要微妙得多,复杂得多

例:血压至少有两个测量值,收缩压和舒张压

示例:许多测试通常同时进行;它们的意义来自于测量之间的相互关系(以及上下文信息和文本解释)


请做一些研究,找到一个现有的设计,你至少可以从它开始。

你的直觉是正确的。“SuperExam表”称为实体属性值数据库,通常用于临床记录,其中稀疏数据绑定到单个实体

E-A-V表很容易搜索。问题不在于查找行,而在于查找相关行

为不同的实体提供不同的表提供了域建模,但它们也提供了一种较弱的元数据形式。在E-A-V中没有这样的抽象。(Java与E-A-V的类比是,声明所有函数的形式参数都是Object类型——因此不会进行类型检查。)

我们可以很容易地查找属性键,但是没有任何东西可以对这些属性键进行分组。没有办法把所有的验血联系在一起,也无法区分验血和体重

一种折衷方法是使用EAV,并使examtype成为另一个表的外键,该表提供了有关examtype的更多数据和/或examtype的分组


Wikipedia有一篇关于E-a-V的非常好的文章,但是现在就读吧——这大部分是一位作者的作品,并且被定为“改进”。很可能你必须采用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
这是存储考试数据的基本结构。那么你有

value:
    value id,
    description

group:
    group id,
    description

group value:
    group value id,
    group id,
    value id,
    sort order

再一次,非常基本,但希望它能让你对我所说的有所了解。您可能想更进一步,定义具有特定组的特定考试类型,然后将考试类型分配给考试,但我将留给您。

可靠的建议。你想传递什么特定的URL?我很想有一个微妙的现有设计的例子,但我有的是没有的现有设计。如果你有任何建议的地方,我可以看看良好的现有设计,我会通知你