首页 > 解决方案 > 数据库设计 - 如何处理条件数据

问题描述

这似乎是这个问题的重复,但我已经检查过了,它没有回答我的情况。

我的情况

考虑这两个表:

patients                           |     vaccines                
                                   |
id | name     | birthdate          |     id | name
---------------------------        |     ---------------
1  | John Doe | 1994-03-12         |     1  | Tetanus
---------------------------        |     ---------------
2  | Jane Doe | 1996-80-02         |     2  | Hepatitis A

而这个数据透视表

patient_vaccine

id | patient_id | vaccine_id | date_received | comment
----------------------------------------------------------------
1  | 1          | 1          | 2019-01-01    | Lorem ipsum dolor set
----------------------------------------------------------------
2  | 1          | 2          | 2019-01-12    | Lorem ipsum dolor set
----------------------------------------------------------------
3  | 2          | 1          | 2018-09-21    | Lorem ipsum dolor set

显然,要说特定患者服用了特定疫苗,将在数据透视表中插入新记录,其中patient_id包含vaccine_id以及附加数据。

但是我有一种情况,如果患者未满 18 岁,则没有vaccine_id,而是有一个took_all_vaccines布尔值。

我的问题

更好的是,将 18 岁以下的患者数据放在一个单独的表中,如下所示:

id | patient_id | took_all_vaccines | date_received | comment
----------------------------------------------------------------
1  | 1          | 1                 | 2019-01-01    | Lorem ipsum dolor set
----------------------------------------------------------------
2  | 1          | 0                 | 2019-01-12    | Lorem ipsum dolor set
----------------------------------------------------------------
3  | 2          | 9                 | 2018-09-21    | Lorem ipsum dolor set

或者我应该将took_all_vaccines列放在数据透视表中并使其可以为空,对于 18 岁以上的人来说它是空的,这也需要让vaccine_id列对于 18 岁以下的人可以为空。

所以我最终会得到这样的结果:

id | patient_id | vaccine_id | took_all_vaccines | date_received | comment
-----------------------------------------------------------------------------
1  | 1          | 1          | null              | 2019-01-01    | Lorem ipsum dolor set
-----------------------------------------------------------------------------
2  | 1          | 2          | null              | 2019-01-12    | Lorem ipsum dolor set
-----------------------------------------------------------------------------
3  | 2          | null       | 1                 | 2018-09-21    | Lorem ipsum dolor set

如果一个解决方案更好,为什么?为什么另一个不是?

标签: mysqldatabasedatabase-designdatabase-schema

解决方案


在标准关系设计中,您称为数据透视表的表通常称为多对多解析器表。这是因为,在高层次上,您的设计涉及患者和疫苗之间的多对多关系。

  • 患者可以接种多种疫苗
  • 许多患者可以接种疫苗

现在到你的具体问题:

这里没有完美的答案,因为这是正常关系之外存在的业务规则,但我会做两件不同的事情之一。

关于疫苗的第一件事是AFAIK,多种疫苗通常一次组合在一起。因此,这需要“注射”表或疫苗表支持父子层次结构的能力。

在我看来,“服用所有疫苗”似乎是一种不具体且实际上不准确的表述,但话说回来,我不知道您的申请。

鉴于此,我认为最简单和最好的答案是在疫苗中添加一行名为“所有疫苗(18 岁以下的患者)”。

然后,您不再需要担心 NULL 外键,这在多对多解析表中肯定是不希望的。

另一种选择是实现注射容器表(注射 1 -> 许多疫苗)并让患者注射替换患者疫苗。您还可以通过将注射和疫苗组合到一个层次表中来做类似的事情,其中​​疫苗可以有一个父“疫苗”行。


推荐阅读