【发布时间】:2019-02-27 07:23:48
【问题描述】:
这似乎是 this question 的重复,但我已经检查过它并没有回答我的情况。
我的情况:
考虑这两个表:
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
如果一个解决方案更好,为什么?为什么另一个不是?
【问题讨论】:
-
只需在表格左侧添加一个名为 injection_ID 或类似名称的 ID。然后,当您选择时,您可以取消所有注射,并查看针对特定患者的疫苗。
-
@AbsoluteƵERØ 会将所有与 18 岁以下相关的列移动到另一个表,但我仍然需要
vaccine_id列为空,我认为这不是一件好事,尤其是它是一个外键。 -
“服用所有疫苗”可能会过时。
-
@KebabProgrammer 为了表明 18 岁以下的患者是否接种了所有疫苗,在这种情况下不能有
vaccine_id值 -
我认为您最好使用第二种方法,因为您始终可以根据程序的条件更新
vaccine_id和took_all_vaccines。如果设置了vaccine_id,则took_all_vaccines为空,反之亦然。
标签: mysql database database-design database-schema