【问题标题】:Relationships in MySQL EER DiagramMySQL EER 图中的关系
【发布时间】:2021-04-12 06:26:47
【问题描述】:

我想在 MySQL EER 图中映射继承。

场景:

员工表是医生和护士表的超类。

员工具有 PK - emp_no 和两个子类的共同属性。

我想在 MySQL Workbench 中创建这些模式。

我搜索了很多示例,发现有 3 种继承解决方案。

其中之一是为每个实体创建一个单独的表,并在子类中包含超类的 PK。

我有以下实体:

employee (emp_no,...)
doctor(doct_no (pk),emp_no(fk),..)
nurse (nurse_no (pk), emp_no(fk),..)

我认为这个解决方案很合理,但是,我对员工及其子类之间的关系类型感到困惑。

这是不是因为两个子类都有自己的 PK 而不是识别关系?

但另一方面,关于医生和护士的所有详细信息都存储在员工表中,所以我想我们无法仅通过查看医生表来识别医生是谁。

如果是识别关系,那么医生的主键就会变成复合键——doct_no,emp_no,对吧?

而且,一般来说,如果我们有employee_no 来标识所有医生和护士,我们真的需要doct_no 和nurse_no 作为子类中的唯一标识符吗?

【问题讨论】:

  • 抛开资质不谈,医生和护士有什么区别?为什么它们是分开的表?
  • 他们有不同的职责。医生检查、操作和监视病人,而护士监视房间。所以关系是主要区别。
  • 我不会有医生和护士的身份证。我只需要一个employee_id,并记录该员工(医生或护士)的角色。
  • 在这种情况下,如何在 EER 图中显示检查患者的员工是医生而不是护士?
  • 我真的不认为这就是(增强的)实体关系图的用途。

标签: mysql relationship entity-relationship


【解决方案1】:

考虑以下数据集:

DROP TABLE IF EXISTS employee;

CREATE TABLE employee
(employee_id SERIAL PRIMARY KEY
,name VARCHAR(30) NOT NULL UNIQUE
,role VARCHAR(12) NOT NULL
);

INSERT INTO employee VALUES
(101,'Dr. No','Doctor'),
(102,'Dr. Pamela Lillian Isley','Doctor'),
(103,'Dr. Miranda Bailey','Doctor'),
(104,'Margaret Houlihan','Nurse'),
(105,'Thor Lundgren','Nurse'),
(106,'Paul Flowers','Nurse');

DROP TABLE IF EXISTS patient;

CREATE TABLE patient
(patient_id SERIAL PRIMARY KEY
,name VARCHAR(30) NOT NULL 
);

INSERT INTO patient VALUES
(11,'Alice'),
(12,'Ben'),
(13,'Charlie'),
(14,'Dawn'),
(15,'Eric');

DROP TABLE IF EXISTS examination;

CREATE TABLE examination
(examination_id SERIAL PRIMARY KEY
,patient_id INT NOT NULL
,employee_id INT NOT NULL
,examination_date DATE NOT NULL
,UNIQUE(patient_id,employee_id,examination_date)
);

INSERT INTO examination VALUES
(1,11,101,'2021-01-01'),
(2,12,104,'2021-01-01'),
(3,12,102,'2021-01-02'),
(4,13,106,'2021-01-02'),
(5,14,105,'2021-01-03'),
(6,15,101,'2021-01-03'),
(7,15,104,'2021-01-03'),
(8,15,106,'2021-01-05');
    

一个查询:

SELECT e.examination_id
     , e.examination_date 
     , p.name patient
     , u.name examined_by
     , u.role   
  FROM examination e 
  JOIN employee u 
    ON u.employee_id = e.employee_id 
  JOIN patient p 
    ON p.patient_id = e.patient_id;
+----------------+------------------+---------+--------------------------+--------+
| examination_id | examination_date | patient | examined_by              | role   |
+----------------+------------------+---------+--------------------------+--------+
|              1 | 2021-01-01       | Alice   | Dr. No                   | Doctor |
|              3 | 2021-01-02       | Ben     | Dr. Pamela Lillian Isley | Doctor |
|              2 | 2021-01-01       | Ben     | Margaret Houlihan        | Nurse  |
|              4 | 2021-01-02       | Charlie | Paul Flowers             | Nurse  |
|              5 | 2021-01-03       | Dawn    | Thor Lundgren            | Nurse  |
|              6 | 2021-01-03       | Eric    | Dr. No                   | Doctor |
|              7 | 2021-01-03       | Eric    | Margaret Houlihan        | Nurse  |
|              8 | 2021-01-05       | Eric    | Paul Flowers             | Nurse  |
+----------------+------------------+---------+--------------------------+--------+

...而不是 EER/ERD

【讨论】:

  • 非常感谢您的详细回复!我同意你的解决方案,我认为它比我的更有效,查询过程也更容易使用更少的空间。但是,我的任务是为医院数据库创建通用 EER 图和 MySQL EER 图。这就是为什么我要询问在 MySQL EER 中表示关系的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 2012-10-09
  • 2017-06-07
相关资源
最近更新 更多