mysql - 数据库设计 - 如何处理条件数据
问题描述
这似乎是这个问题的重复,但我已经检查过了,它没有回答我的情况。
我的情况:
考虑这两个表:
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
如果一个解决方案更好,为什么?为什么另一个不是?
解决方案
在标准关系设计中,您称为数据透视表的表通常称为多对多解析器表。这是因为,在高层次上,您的设计涉及患者和疫苗之间的多对多关系。
- 患者可以接种多种疫苗
- 许多患者可以接种疫苗
现在到你的具体问题:
这里没有完美的答案,因为这是正常关系之外存在的业务规则,但我会做两件不同的事情之一。
关于疫苗的第一件事是AFAIK,多种疫苗通常一次组合在一起。因此,这需要“注射”表或疫苗表支持父子层次结构的能力。
在我看来,“服用所有疫苗”似乎是一种不具体且实际上不准确的表述,但话说回来,我不知道您的申请。
鉴于此,我认为最简单和最好的答案是在疫苗中添加一行名为“所有疫苗(18 岁以下的患者)”。
然后,您不再需要担心 NULL 外键,这在多对多解析表中肯定是不希望的。
另一种选择是实现注射容器表(注射 1 -> 许多疫苗)并让患者注射替换患者疫苗。您还可以通过将注射和疫苗组合到一个层次表中来做类似的事情,其中疫苗可以有一个父“疫苗”行。
推荐阅读
- vba - excel - 根据图例更改颜色条形图
- javascript - 隐藏当 document.click 时,显示当搜索框点击时(php mysql)
- vba - 带有like语句的OUTLOOK vba过滤器
- laravel - 使用模式窗口更新行后刷新数据表
- php - 将 data-mfp-src 属性添加到图像标签 PHP
- sql - SQL Server:带案例查看
- java - 在 Hybris 中找出模型属性发生变化的地方
- airflow - 气流调度程序内存不足问题
- javascript - 如何改进此功能以覆盖 Excel 单元格?
- java - 检索 ResultSet 值时获取 IN 参数而不是行