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

时间:2016-12-19 06:40:20

标签: mysql database one-to-many one-to-one

注意:这不是库存控制系统。我只想确定给哪个病人服用的药物。我不考虑有多少药物包等只是一次用药事件

我对数据库关系的突然混淆,即使在与他们合作多年之后也是如此。以下是我的情况。

我有一张名为patient的表格,其中包含患者的信息。我有另一张名为medication的桌子,它将持有patient所规定的药物。 我想找到这种关系,所以我向我提出了以下问题。

  1. 一位患者可以服用多种药物吗? - 答案:是
  2. 一种处方药可以有很多患者吗? - 答案:否(例如:您不能给患者服用扑热息痛,将其取出并交给其他人)
  3. 我需要在patient表格中创建medication的外键。我很困惑,因为我对第一个问题的回答告诉我它是{{ 1}}关系虽然第二个答案说我是one to many关系。

    我计划在one to one表中添加patient的外键时的确切关系是什么?

    以下是我的结构

    enter image description here

5 个答案:

答案 0 :(得分:2)

这在某种程度上取决于你桌子的结构类型。

示例1

Patient:

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

Patient_Medication:

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

你是一对多的关系。患者John可以在处方表中使用多种药物。

示例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称为联结表。

答案 1 :(得分:1)

我认为这种关系实际上应该是多对多的。给定的患者记录可以指向几种不同的药物,同样,给定的药物记录可以指向几个不同的患者。

实现这一目标的一种方法是创建第三个表格,将患者映射到药物(或者对患者进行药物治疗,如果您愿意这样考虑的话)。此表可能如下所示:

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可能是给定药物包装的唯一标识符。在另一张表中,每种独特的药物都与该药物的父表相关。

<强>更新

您当前的架构看起来并不遥远,除了您标记为medication的表实际上是患者与其药物剂量之间的桥接表。您需要第三个表来存储每种药物的元数据。对于所有药物剂量,该元数据将是恒定的,例如,药物类型,费用等。

答案 2 :(得分:1)

你的第二个问题:

  1. 一种处方药可以有很多患者吗? - 答案:否(例如:您不能给患者喝扑热息痛,将其取出并交给其他人)
  2. 我想在这里你已经假定在现实世界中开药和实际消费调解(实际平板电脑)是一回事。

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

    如果你的餐桌和药物治疗&#34;你的答案是正确的。将存储实际的药物实例。

    E.g。

    药物

    Id名称

    1 Paracetomol 25mg Instance 1

    2 Paracetomol 25mg实例2

    3 Paracetomol 25mg Instance 3

    现在,桌子实际上包含两名病人无法消费的药物实例。在这里你的回答&#34;否&#34;是的,我猜,是的。

    另一件事是,正如你所说,你没有在库存系统上工作,只是试图绘制药物,你仍然依附于两个病人无法消费的真实世界库存项目。

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

答案 3 :(得分:0)

您的混淆可能是因为没有定义药物表实际代表的内容。在我看来,你的药物和实际包装都很混乱。

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

我认为你对问题二的答案是错误的,许多患者可以服用同样的药物。您库存的数据包数量应该在一个单独的表格中处理,您可以在其中保存有关您拥有的数据包数量,位置等等的信息。

所以你至少需要三张桌子

病人 - 抱着病人 药物 - 持有药物的类型 patient_medication - 保存患者所服用的药物类型的信息

然后,您可以添加另一个表格来保存您拥有的药物数量以及与系统相关的药物储存地点的信息。

答案 4 :(得分:0)

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

  • 每位患者可以服用零次或多次药物
  • 每种药物属于一名且仅有一名患者

这有助于确定关系的基数并阐明功能依赖性。如果只指定了一个方向,则很难区分一对多与多对多关联。

当谈到整个关系时,我们采取“开销视角”而忽略了个体实体的视角,因此我们将这个例子称为零到零或更多,或者通常只是一对一许多。

当您从任何一方的单个实体的角度查看时,多对多关系看起来像两个一对多关联。