ErdDocs

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 테이블로 충분합니다. 실제 시스템은 근무표, 면허, 급여가 달라 직종별로 나눕니다. 단순하게 시작하고, 쿼리가 필요로 할 때 나누세요.

다른 예제