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.
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.