ErdDocs

Exemplos / Sistema hospitalar

Sistema hospitalar

O banco de dados de um hospital gira em torno de duas tabelas de eventos. A consulta é um atendimento ambulatorial com um médico, e a internação, uma permanência numa ala. As duas tabelas apontam para o paciente. As receitas são emitidas por consulta e referenciam um catálogo de medicamentos.

Abaixo, o ErdDocs desenha este schema a partir do SQL, com todas as tabelas e relacionamentos. Na aba «Dicionário de dados» está a versão para imprimir, completa e grátis nesta página. O SQL fica mais abaixo.

Seu schema

Passe o mouse sobre uma tabela para destacar os relacionamentos e clique para fixá-los.

O que cada tabela faz

  • patientsA equipe usa o número do prontuário, mrn. O id substituto fica interno.
  • doctors / departmentsUm relacionamento um para muitos simples. A especialidade é do médico, não do departamento.
  • appointmentsO atendimento ambulatorial, com paciente, médico, horário e resultado.
  • admissionsA permanência no hospital. Enquanto ela dura, discharged_at fica NULL.
  • medications / prescriptionsA receita depende da consulta, porque o atendimento dá o contexto clínico do pedido.

Decisões de modelagem que vale copiar

  • Consultas e internações ficam em tabelas separadas, e não numa tabela «atendimentos» com coluna de tipo. Elas quase não compartilham colunas. Juntá-las encheria o schema de NULL com sentido diferente para cada tipo.
  • A receita referencia a consulta, e não paciente e médico separados. O atendimento serve de contexto para a auditoria, e a partir dele se chega ao paciente e ao médico.
  • Um NULL em discharged_at significa «ainda internado». É um fato que se pode consultar. Uma coluna de status à parte precisaria ser mantida em sincronia à mão.

O SQL

Dialeto PostgreSQL. Este SQL já está na ferramenta acima, e você pode copiá-lo à vontade para o seu banco ou para uma 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 'Número do prontuário: o identificador que a equipe usa';

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 'agendada -> atendida, ou não compareceu / cancelada';

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 enquanto o paciente está internado';

CREATE TABLE medications (
    id    bigserial    PRIMARY KEY,
    name  varchar(120) NOT NULL,
    form  varchar(40)  NOT NULL
);
COMMENT ON COLUMN medications.form IS 'comprimido / injeção / xarope …';

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

Perguntas frequentes

Onde entram os exames de laboratório?

São necessárias duas tabelas. A tabela lab_orders referencia a consulta, como as receitas. A tabela lab_results referencia lab_orders, um para um ou um para muitos, conforme o laudo tenha várias linhas.

Uma tabela de médicos basta para enfermagem e equipe?

Para um schema de estudo, uma tabela staff com coluna de função resolve. Sistemas reais separam a equipe clínica porque escala, registro profissional e faturamento são diferentes. Comece simples e separe quando uma consulta exigir.

Mais exemplos