ErdDocs

Ví dụ / Hệ thống quản lý bệnh viện

Hệ thống quản lý bệnh viện

Cơ sở dữ liệu bệnh viện xoay quanh hai bảng sự kiện. Lịch khám là một lần khám ngoại trú với bác sĩ, còn nhập viện là một đợt nằm viện. Cả hai bảng đều tham chiếu bệnh nhân. Đơn thuốc được kê theo từng lần khám và tham chiếu danh mục thuốc.

Bên dưới, ErdDocs vẽ lược đồ này từ SQL của nó, với mọi bảng và quan hệ. Tab «Từ điển dữ liệu» có tài liệu tham chiếu để in, đầy đủ và miễn phí ngay trên trang này. Đoạn SQL nằm ở cuối trang.

Lược đồ của bạn

Rê chuột lên một bảng để làm nổi các quan hệ. Bấm chuột để giữ phần làm nổi.

Mỗi bảng làm gì

  • patientsNhân viên dùng số hồ sơ bệnh án mrn trong công việc. Khóa thay thế id chỉ dùng nội bộ.
  • doctors / departmentsQuan hệ một-nhiều đơn giản. Chuyên khoa thuộc về bác sĩ, không thuộc về khoa.
  • appointmentsMột lần khám ngoại trú, gồm bệnh nhân, bác sĩ, thời gian và kết quả.
  • admissionsMột đợt nằm viện nội trú. Khi bệnh nhân còn nằm viện, discharged_at là NULL.
  • medications / prescriptionsĐơn thuốc gắn với lần khám, vì lần khám là bối cảnh lâm sàng của y lệnh.

Những quyết định thiết kế đáng học

  • Lịch khám và nhập viện là hai bảng riêng, không gộp thành một bảng «lượt đến» có cột loại. Hai bảng này hầu như không có cột chung. Nếu gộp lại, bảng sẽ đầy những NULL mà ý nghĩa tùy vào loại.
  • Đơn thuốc tham chiếu lần khám, không tham chiếu trực tiếp bệnh nhân và bác sĩ. Lần khám là bối cảnh cho kiểm toán. Từ lần khám có thể tìm ra cả bệnh nhân lẫn bác sĩ.
  • discharged_at là NULL nghĩa là «còn nằm viện». Đây là một sự thật truy vấn được. Một cột trạng thái riêng thì phải cập nhật bằng tay cho khớp.

SQL

Phương ngữ PostgreSQL. Đoạn SQL này đã có sẵn trong công cụ phía trên. Bạn có thể thoải mái sao chép và đưa nó vào cơ sở dữ liệu của mình hoặc vào một 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 'Số hồ sơ bệnh án – mã mà nhân viên thực sự dùng';

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 'đã hẹn -> đã khám, hoặc không đến / đã hủy';

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 khi bệnh nhân còn nằm viện';

CREATE TABLE medications (
    id    bigserial    PRIMARY KEY,
    name  varchar(120) NOT NULL,
    form  varchar(40)  NOT NULL
);
COMMENT ON COLUMN medications.form IS 'viên / tiêm / siro …';

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
);

Câu hỏi thường gặp

Xét nghiệm để ở đâu?

Cần hai bảng. Bảng lab_orders tham chiếu lần khám, giống như đơn thuốc. Bảng lab_results tham chiếu lab_orders theo quan hệ một-một, hoặc một-nhiều nếu một xét nghiệm có nhiều chỉ số.

Một bảng bác sĩ có đủ cho cả điều dưỡng và nhân viên không?

Với lược đồ bài tập, một bảng staff có cột vai trò là đủ. Hệ thống thật tách riêng nhân viên lâm sàng, vì lịch trực, chứng chỉ hành nghề và lương của họ khác nhau. Hãy bắt đầu đơn giản và chỉ tách bảng khi truy vấn cần đến.

Ví dụ khác