-- PostgreSQL schema. -- Stores users, venues, reservable time slots, bookings, payments, and cancellations. -- All timestamps are timezone-aware, and monetary values use fixed-precision NUMERIC. CREATE TABLE users ( user_id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, email VARCHAR(320) NOT NULL, full_name VARCHAR(200) NOT NULL, phone VARCHAR(32), status VARCHAR(20) NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'suspended')), created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, deleted_at TIMESTAMPTZ, CONSTRAINT ck_users_deleted_at CHECK (deleted_at IS NULL OR deleted_at >= created_at) ); CREATE TABLE venues ( venue_id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name VARCHAR(200) NOT NULL, description TEXT, address_line1 VARCHAR(200) NOT NULL, address_line2 VARCHAR(200), city VARCHAR(100) NOT NULL, region VARCHAR(100), postal_code VARCHAR(32), country_code CHAR(2) NOT NULL CHECK (country_code = UPPER(country_code)), timezone VARCHAR(64) NOT NULL, capacity INTEGER NOT NULL CHECK (capacity > 0), status VARCHAR(20) NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'inactive', 'closed')), created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, deleted_at TIMESTAMPTZ, CONSTRAINT ck_venues_deleted_at CHECK (deleted_at IS NULL OR deleted_at >= created_at) ); CREATE TABLE time_slots ( time_slot_id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, venue_id BIGINT NOT NULL, starts_at TIMESTAMPTZ NOT NULL, ends_at TIMESTAMPTZ NOT NULL, price_amount NUMERIC(12,2) NOT NULL CHECK (price_amount >= 0), currency CHAR(3) NOT NULL CHECK (currency = UPPER(currency)), status VARCHAR(20) NOT NULL DEFAULT 'available' CHECK (status IN ('available', 'blocked', 'unavaila
Desenhador de esquemas de BD
Entrada
- Descrição do domínio
- a booking system: users, venues, time slots, payments, cancellations
Resultado de exemplo
Criado em 27 outubro 2026
Usar isto
Desenhador de esquemas de BD
O formulário abre preenchido com as entradas deste exemplo; altere o que quiser.