ErdDocs

ER 圖範例 / 醫院管理系統

醫院管理系統

醫院的資料庫圍繞兩種「事件」資料表:門診預約(和醫師的看診)與住院(在病房的停留)。兩者都參照病患。處方在每次門診開立,並參照藥品目錄。

下方由 ErdDocs 依 SQL 畫出這份結構,包含所有資料表與關聯。「資料字典」分頁有可列印的版本,在本頁免費完整顯示。SQL 在頁面更下方。

你的結構

把滑鼠移到資料表上會標示它的關聯,點一下即可固定。

每個資料表的用途

  • patientsmrn(病歷號碼)是業務上用的識別碼,代理鍵 id 僅供內部使用。
  • doctors / departments單純的一對多。專長屬於醫師,不屬於科別。
  • appointments門診事件:病患、醫師、時間、結果。
  • admissions住院事件。住院尚未結束時,discharged_at 為 NULL。
  • medications / prescriptions處方掛在門診上,因為看診是這份處方的臨床脈絡。

值得借鏡的設計決策

  • 門診預約與住院是分開的資料表,而不是一張帶類型欄位的 visits。兩者幾乎沒有共同欄位,合併只會產生意義隨類型而變的 NULL。
  • 處方參照門診,而不是直接參照病患與醫師。看診是稽核的脈絡,從它就能追到另外兩者。
  • discharged_at 為 NULL 就代表「仍在住院」。這是可以查詢的事實,而不是需要保持同步的狀態字串。

SQL

PostgreSQL 方言。可以貼進上方工具(已經放好了)、你自己的資料庫或 migration,也可以自由複製。

CREATE TABLE departments (
    id    bigserial   PRIMARY KEY,
    name  varchar(80) NOT NULL UNIQUE
);

CREATE TABLE doctors (
    id             bigserial    PRIMARY KEY,
    department_id  bigint       NOT NULL REFERENCES departments(id),
    full_name      varchar(120) NOT NULL,
    specialty      varchar(80)  NOT NULL
);

CREATE TABLE patients (
    id          bigserial    PRIMARY KEY,
    mrn         varchar(20)  NOT NULL UNIQUE,
    full_name   varchar(120) NOT NULL,
    born_on     date         NOT NULL,
    blood_type  varchar(3)
);
COMMENT ON COLUMN patients.mrn IS '病歷號碼,工作人員實際使用的識別碼';

CREATE TABLE appointments (
    id          bigserial   PRIMARY KEY,
    patient_id  bigint      NOT NULL REFERENCES patients(id),
    doctor_id   bigint      NOT NULL REFERENCES doctors(id),
    at          timestamptz NOT NULL,
    status      varchar(20) NOT NULL DEFAULT 'booked',
    notes       text
);
COMMENT ON COLUMN appointments.status IS '已預約 -> 已看診,或未到 / 已取消';

CREATE TABLE admissions (
    id           bigserial   PRIMARY KEY,
    patient_id   bigint      NOT NULL REFERENCES patients(id),
    ward         varchar(40) NOT NULL,
    admitted_at  timestamptz NOT NULL,
    discharged_at timestamptz
);
COMMENT ON COLUMN admissions.discharged_at IS '住院期間為 NULL';

CREATE TABLE medications (
    id    bigserial    PRIMARY KEY,
    name  varchar(120) NOT NULL,
    form  varchar(40)  NOT NULL
);
COMMENT ON COLUMN medications.form IS '錠劑 / 注射 / 糖漿 …';

CREATE TABLE prescriptions (
    id              bigserial  PRIMARY KEY,
    appointment_id  bigint     NOT NULL REFERENCES appointments(id),
    medication_id   bigint     NOT NULL REFERENCES medications(id),
    dosage          varchar(60) NOT NULL,
    days            int        NOT NULL
);

常見問題

檢驗與檢驗結果要放在哪裡?

放在和處方一樣參照門診的 lab_orders 資料表,以及參照 lab_orders 的 lab_results 資料表。一次檢驗有多個項目時,就是一對多。

一張醫師資料表能涵蓋護理師與職員嗎?

作業用的結構,一張帶 role 欄位的 staff 資料表就夠了。實際系統會依職類分開,因為排班、證照與薪資都不同。先簡單建立,等查詢需要時再拆開。

其他範例