ERD 예제 / 병원 관리 시스템
병원 관리 시스템
병원 데이터베이스는 두 「사건」 테이블을 중심으로 돌아갑니다. 외래 예약(의사와의 진료)과 입원(병동에 머무는 기간)입니다. 둘 다 환자를 참조합니다. 처방은 외래 예약마다 작성되고, 약품 목록을 참조합니다.
아래에서 ErdDocs가 이 스키마의 모든 테이블과 관계를 SQL로 그립니다. 「데이터 사전」 탭에는 인쇄용 문서가 있고, 이 페이지에서 전체를 무료로 볼 수 있습니다. SQL은 페이지 아래쪽에 있습니다.
내 스키마
테이블에 마우스를 올리면 관계가 강조되고, 클릭하면 고정됩니다.
각 테이블의 역할
- patientsmrn(진료 기록 번호)이 업무용 식별자이고, 대리 키 id는 내부용입니다.
- doctors / departments단순한 일대다. 전공은 진료과가 아니라 의사가 가집니다.
- appointments외래 사건: 환자, 의사, 시간, 결과.
- admissions입원 사건입니다. 퇴원 전까지 기간이 열려 있고, 입원 중에는 discharged_at이 NULL입니다.
- medications / prescriptions처방은 외래 예약에 매달립니다. 진료가 그 처방의 임상적 맥락이기 때문입니다.
가져갈 만한 설계 결정
- 외래 예약과 입원은 종류 컬럼이 있는 하나의 visits 테이블이 아니라 별도 테이블입니다. 공통 컬럼이 거의 없고, 합치면 종류에 따라 뜻이 달라지는 NULL이 생깁니다.
- 처방은 환자와 의사를 직접이 아니라 외래 예약을 참조합니다. 진료가 감사의 맥락이며, 환자와 의사는 거기서 따라갈 수 있습니다.
- discharged_at을 NULL 허용으로 두면 「입원 중」이 조회 가능한 사실이 되고, 동기화를 맞춰야 할 상태 문자열이 필요 없습니다.
SQL
PostgreSQL 방언입니다. 위의 툴(이미 들어 있습니다), 내 데이터베이스, 마이그레이션에 자유롭게 복사해서 쓰세요.
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 '진료 기록 번호. 직원이 실제로 쓰는 ID';
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 테이블로 충분합니다. 실제 시스템은 근무표, 면허, 급여가 달라 직종별로 나눕니다. 단순하게 시작하고, 쿼리가 필요로 할 때 나누세요.