数据库:“一对一”与“一对多”

Database: `One to One` vs `One to Many`

注意:这不是库存控制系统。我只是想绘制给哪个患者服用哪种药物的地图。我没有考虑多少药包等。只是一次用药事件

我对数据库关系突然感到困惑,即使在与他们合作多年之后也是如此。下面是我的情况。

我有一个名为 patient 的 table,它将保存患者的信息。我还有另一个 table 叫做 medication,它可以存放 patient 的处方药。 我想找到关系,所以我问了下面的问题。

  1. 一个病人可以开很多药吗? - 答案:是
  2. 一种处方药可以有很多病人吗? - 回答:不(例如:你不能给病人服用扑热息痛,然后拿出来给别人喝)

我需要在 medication table 中创建 patient 的外键 table。 我很困惑,因为我的第一个答案问题告诉我这是 one to many 关系,而第二个答案告诉我这是 one to one 关系。

当我打算在medication table中添加patient的外键时,确切的关系是什么?

下面是我的结构

我觉得关系其实应该是many-to-many。给定的患者记录可以指向几种不同的药物,同样,给定的药物记录可以指向几个不同的患者。

实现这一点的一种方法是创建第三个 table,它将患者映射到药物(或药物映射到患者,如果您愿意这样想的话)。这个 table 可能看起来像这样:

id | patient_id | medication_id | date
1  | 1          | 1             | 2016-12-19
2  | 1          | 2             | 2016-12-18
3  | 2          | 2             | 2016-12-18

以上数据表明患者 1 服用了药物 1 和 2,患者 2 也服用了药物 2。我还添加了一个日期,这可能代表给定患者就诊。

medication_id 可能是给定药物包的唯一标识符。在另一个 table 中,每种独特的药物都与该药物的 parent table 相关。

更新:

您当前的架构看起来并不遥远,除了您标记为 medication 的 table 实际上是患者和他们的药物剂量之间的桥梁 table。您将需要第三个 table 来存储每种药物的元数据。此元数据对于 所有 药物剂量来说都是不变的,例如药物种类、费用等

这在某种程度上取决于您 table 的结构类型。

示例 1

Patient:

PatientID Name
--------- ----
1         John
2         Matt

Patient_Medication:

PrescriptionID PatientID Name
-------------- --------- ------------
1              1         Antacid
2              1         Paracetamol
3              2         Asthma inhaler

您处于一对多关系中。患者 John 的处方中可以有多种药物 table。

示例 2

Patient:

PatientID Name
--------- ----
1         John
2         Matt
3         Katie

Medication:

MedicationID Name
------------ ----
1            Antacid
2            Paracetamol
3            Asthma inhaler

Patient_Medication:

ID  PatientID MedicationID
--- --------- ------------
1   1 (John)        1 (Antacid)
2   1 (John)        2 (Paracetamol)
3   2 (Matt)        3 (Asthma inhaler)
4   3 (Katie)       2 (Paracetamol)
5   3 (Katie)       3 (Asthma inhaler)

这种情况是多对多的关系,许多患者可以有很多药物,反之亦然。通常Patient_Medication被称为结点table。

您的困惑可能是由于没有定义药物 table 实际代表的结果。在我看来,您混淆了药物类型和实际包装。

那么你想建立什么样的关系?您是在做一个可以清点您拥有多少药物的系统,还是在做一个可以告诉您有多少患者正在服用特定药物的患者系统。

我认为你对问题二的回答是错误的,许多患者可以服用同一种药物。您库存的包裹数量应在单独的 table 中处理,您可以在其中保存有关您拥有多少包裹、它们的位置等信息。

所以你至少需要三个table

patient - 抱着病人 medication - 包含药物的类型 patient_medication - 保存有关患者服用何种药物的信息

然后您可以添加其他内容 table 来保存有关您拥有多少药物以及药物存储位置的信息(如果与系统相关)。

关联在一个方向上是一对多,在另一个方向上是一对一也没有错。在规划数据库时,我经常建议人们写出两个方向的关联:

  • 每位患者可以有零种或多种药物
  • 每种药物只属于一位患者

这有助于确定关系的基数并阐明函数依赖性。当只指定一个方向时,很难区分一对多和多对多关联。

在讨论整体关系时,我们采用 "overhead perspective" 并忽略个体实体的视角,因此我们将此示例称为一对零或多个,或者通常只是一个-对多。

从任何一方的个体实体的角度来看,多对多关系看起来就像两个一对多关联。

你的第二个问题:

  1. 一种药能有很多病人吗? - 回答:不(例如:你不能给病人服用扑热息痛喝,拿出来给别人吃)

我猜你已经假设在现实世界中开药和实际服用该药物(实际 tablet)是一回事。

药物 table 只是药物的名称持有者。

如果您的 table "Medication" 将存储药物的实际实例,那么您的答案就是正确的。

例如

药物治疗

身份证姓名

1 扑热息痛 25 毫克实例 1

2 扑热息痛 25 毫克实例 2

3 扑热息痛 25 毫克实例 3

现在这里,table 实际上包含不能由两个患者服用的药物实例。我猜你的答案 "No" 是正确的。

另一件事是,正如您所说,您没有在库存系统上工作,只是想绘制药物图,您仍然依附于现实世界的库存项目,两个患者不能消耗这些项目。

此处您在不需要库存项目的系统中混合库存项目。