这可能看起来与 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
显然,如果特定患者接种了特定疫苗,则将在数据透视表中插入一条新记录,其中包含 patent_id
和 vaccine_id
以及附加数据。
但我遇到一种情况,如果患者18岁以下,则不会有vaccine_id
,而是会有took_all_vaccines
bool 值。
我的问题:
更好的做法是,将 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
如果有一种解决方案更好,为什么?为什么另一个不是?
最佳答案
在标准关系设计中,您称为数据透视表的表通常称为多对多解析器表。这是因为,在较高的层面上,您的设计涉及患者和疫苗之间的多对多关系。
- 一名患者可以接种多种疫苗
- 疫苗可供许多患者接种
现在回答您的具体问题:
这里没有完美的答案,因为这是正常关系之外存在的业务规则,但我会做两件不同的事情之一。
关于疫苗的第一件事是,据我所知,多种疫苗通常会同时注入(inject)。因此,这需要一个“射击”表,或者疫苗表支持父子层次结构的能力。
“接种了所有疫苗”在我看来是一种非具体且事实上不准确的表述,但话又说回来,我不知道您的申请。
鉴于此,我认为最简单和最好的答案是在疫苗中添加一行名为“所有疫苗(18 岁以下患者)”。
然后您不再需要关心 NULL 外键,在多对多解析表中您肯定不希望出现这种情况。
另一种选择是实现注入(inject)容器表(注入(inject) 1 -> 许多疫苗)并用病人_射击替换病人_疫苗。您还可以通过将疫苗和疫苗组合到单个分层表中来执行类似的操作,其中疫苗可以具有父“疫苗”行。
关于mysql - 数据库设计——如何处理条件数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54889979/