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 資料表就夠了。實際系統會依職類分開,因為排班、證照與薪資都不同。先簡單建立,等查詢需要時再拆開。