数据库:“一对一”与“一对多”
Database: `One to One` vs `One to Many`
注意:这不是库存控制系统。我只是想绘制给哪个患者服用哪种药物的地图。我没有考虑多少药包等。只是一次用药事件
我对数据库关系突然感到困惑,即使在与他们合作多年之后也是如此。下面是我的情况。
我有一个名为 patient
的 table,它将保存患者的信息。我还有另一个 table 叫做 medication
,它可以存放 patient
的处方药。
我想找到关系,所以我问了下面的问题。
- 一个病人可以开很多药吗? - 答案:是
- 一种处方药可以有很多病人吗? - 回答:不(例如:你不能给病人服用扑热息痛,然后拿出来给别人喝)
我需要在 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" 并忽略个体实体的视角,因此我们将此示例称为一对零或多个,或者通常只是一个-对多。
从任何一方的个体实体的角度来看,多对多关系看起来就像两个一对多关联。
你的第二个问题:
- 一种药能有很多病人吗? - 回答:不(例如:你不能给病人服用扑热息痛喝,拿出来给别人吃)
我猜你已经假设在现实世界中开药和实际服用该药物(实际 tablet)是一回事。
药物 table 只是药物的名称持有者。
如果您的 table "Medication" 将存储药物的实际实例,那么您的答案就是正确的。
例如
药物治疗
身份证姓名
1 扑热息痛 25 毫克实例 1
2 扑热息痛 25 毫克实例 2
3 扑热息痛 25 毫克实例 3
现在这里,table 实际上包含不能由两个患者服用的药物实例。我猜你的答案 "No" 是正确的。
另一件事是,正如您所说,您没有在库存系统上工作,只是想绘制药物图,您仍然依附于现实世界的库存项目,两个患者不能消耗这些项目。
此处您在不需要库存项目的系统中混合库存项目。
注意:这不是库存控制系统。我只是想绘制给哪个患者服用哪种药物的地图。我没有考虑多少药包等。只是一次用药事件
我对数据库关系突然感到困惑,即使在与他们合作多年之后也是如此。下面是我的情况。
我有一个名为 patient
的 table,它将保存患者的信息。我还有另一个 table 叫做 medication
,它可以存放 patient
的处方药。
我想找到关系,所以我问了下面的问题。
- 一个病人可以开很多药吗? - 答案:是
- 一种处方药可以有很多病人吗? - 回答:不(例如:你不能给病人服用扑热息痛,然后拿出来给别人喝)
我需要在 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" 并忽略个体实体的视角,因此我们将此示例称为一对零或多个,或者通常只是一个-对多。
从任何一方的个体实体的角度来看,多对多关系看起来就像两个一对多关联。
你的第二个问题:
- 一种药能有很多病人吗? - 回答:不(例如:你不能给病人服用扑热息痛喝,拿出来给别人吃)
我猜你已经假设在现实世界中开药和实际服用该药物(实际 tablet)是一回事。
药物 table 只是药物的名称持有者。
如果您的 table "Medication" 将存储药物的实际实例,那么您的答案就是正确的。
例如
药物治疗
身份证姓名
1 扑热息痛 25 毫克实例 1
2 扑热息痛 25 毫克实例 2
3 扑热息痛 25 毫克实例 3
现在这里,table 实际上包含不能由两个患者服用的药物实例。我猜你的答案 "No" 是正确的。
另一件事是,正如您所说,您没有在库存系统上工作,只是想绘制药物图,您仍然依附于现实世界的库存项目,两个患者不能消耗这些项目。
此处您在不需要库存项目的系统中混合库存项目。