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

标签 mysql database database-design database-schema

这可能看起来与 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_idvaccine_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/

相关文章:

php - 将大约 1500 个 mysql 条目复制到同一个表中并进行少量更改的最佳方法是什么?

php - 存储过程无法使用 mysql 中的 php 代码传递 xml 作为输入

python - 如何组织数据库访问层?

database - 一对多对多

mysql - 如何使mysql多列索引以快速执行

php - 以样式显示来自 Mysql 表的数据

javascript - 从 Google map (V3) 外部打开特定标记的信息窗口

sql - 如何使用 Oracle SQL Developer 连接到数据库

mysql - 产品属性的数据库模式

php - 如何为访问数据库的应用程序分段数据库(也称为多个用户问题的单个数据库)?