数据库设计-如何处理条件数据

时间:2019-02-26 16:25:12

标签: mysql database database-design database-schema

这似乎是this question的重复,但我已经检查了一下,但无法解决我的情况。

我的案子

请考虑以下两个表:

Form1.radiobutton1.checked = true

这个数据透视表

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以及附加数据的数据透视表中插入一条新记录。

但是我遇到的情况是,如果患者未满18岁,则不会有vaccine_id,而是会有vaccine_id布尔值。

我的问题

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

took_all_vaccines

或者我应该将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 列放到数据透视表中,并使之为null,对于18岁以上的人为null,这也需要将took_all_vaccines列为null适用于18岁以下的人群。

所以我最终会得到这样的东西:

vaccine_id

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

2 个答案:

答案 0 :(得分:1)

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

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

现在是您的特定问题:

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

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

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

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

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

另一种选择是实现注射容器表(注射1->许多疫苗),并用Patient_shot代替Patient_vaccine。您也可以通过将注射疫苗和疫苗合并到一个单独的层次表中来执行类似的操作,其中疫苗可以有一个父“疫苗”行。

答案 1 :(得分:0)

我不会实施该标志,也不会在患者_疫苗表中添加“接受所有疫苗”。

原因: 明天您可能会决定添加新的疫苗,并且现在标记为已获得所有疫苗的所有患者的结果都将被破坏。您将失去对他们没有接种新疫苗的跟踪。