这似乎是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
如果一个解决方案更好,为什么?为什么另一个不是?
您在标准关系设计中调用数据透视表的表通常称为多对多解析程序表。这是因为,在很高的层次上,您的设计涉及患者和疫苗之间的关系,这种关系是多对多的。
现在来看你的具体问题:
这里没有完美的答案,因为这是一种存在于正常关系之外的商业规则,但我会做两种不同的事情之一。
Vaccines的第一件事就是AFAIK,多种疫苗通常一次性合并。因此,这需要一个“镜头”表,或者疫苗表支持父子层次结构的能力。
在我看来,“接种所有疫苗”是一种非特异性且事实上不准确的代表,但我再也不知道你的申请。
鉴于此,我认为最简单和最好的答案是在疫苗中添加一行名为“所有疫苗(18岁以下的患者)”。
然后你不再需要关注NULL外键,你肯定不希望在多对多分辨率表中。
另一种选择是实施注射容器表(注射1 - >许多疫苗)并让patient_shot替换patient_vaccine。你也可以通过将疫苗和疫苗结合到一个分层表中来做类似的事情,疫苗可以有一个父“疫苗”行。
我不会实施该标志或添加'Took all vaccines'作为进入patient_vaccine表的条目。
原因:明天您可能决定为所有患者添加新的疫苗和结果,现在标记为所有疫苗都将被毁坏。您将失去他们没有接种新添加疫苗的赛道。