diff --git a/schemas/04_log.sql b/schemas/04_log.sql index 0add790..79f818b 100644 --- a/schemas/04_log.sql +++ b/schemas/04_log.sql @@ -1,6 +1,8 @@ -- ============================================ -- SCHEMA LOG - Sistema TZZR -- Log inmutable de mensajes +-- Versión: 2.0 +-- Fecha: 2026-01-01 -- ============================================ DROP SCHEMA IF EXISTS log CASCADE; @@ -13,7 +15,7 @@ CREATE EXTENSION IF NOT EXISTS pgcrypto; CREATE TYPE log.ref_type AS ENUM ('context', 'accountant', 'secretary'); -- ============================================ --- Tabla 1: messages +-- Tabla principal: messages -- ============================================ CREATE TABLE log.messages ( id BIGSERIAL PRIMARY KEY, @@ -21,7 +23,7 @@ CREATE TABLE log.messages ( session_hash CHAR(64) NOT NULL, thread_hash CHAR(64), owner_id CHAR(64) NOT NULL, - players_id CHAR(64)[] DEFAULT '{}', + players_id CHAR(64)[] NOT NULL DEFAULT '{}', master_player CHAR(64), role TEXT, content TEXT NOT NULL, @@ -36,21 +38,23 @@ CREATE TABLE log.messages ( created_at TIMESTAMPTZ DEFAULT NOW() ); +-- Índices messages CREATE INDEX idx_messages_session ON log.messages(session_hash); CREATE INDEX idx_messages_thread ON log.messages(thread_hash); CREATE INDEX idx_messages_owner ON log.messages(owner_id); -CREATE INDEX idx_messages_master_player ON log.messages(master_player); -CREATE INDEX idx_messages_prev ON log.messages(prev_hash); -CREATE INDEX idx_messages_created ON log.messages(created_at); -CREATE INDEX idx_messages_hashtags ON log.messages USING gin(hashtags); CREATE INDEX idx_messages_players ON log.messages USING gin(players_id); -CREATE INDEX idx_messages_items ON log.messages USING gin(item_id); +CREATE INDEX idx_messages_master ON log.messages(master_player); +CREATE INDEX idx_messages_prev ON log.messages(prev_hash); +CREATE INDEX idx_messages_hashtags ON log.messages USING gin(hashtags); CREATE INDEX idx_messages_flag ON log.messages(flag_id); +CREATE INDEX idx_messages_master_item ON log.messages(master_item_id); +CREATE INDEX idx_messages_items ON log.messages USING gin(item_id); CREATE INDEX idx_messages_loc ON log.messages(loc_id); +CREATE INDEX idx_messages_created ON log.messages(created_at); -- ============================================ --- Tabla 2: message_refs --- Relaciona mensaje con contexto y conocimiento +-- Tabla relacional: message_refs +-- Referencias a contexto y conocimiento -- ============================================ CREATE TABLE log.message_refs ( id BIGSERIAL PRIMARY KEY, @@ -59,9 +63,10 @@ CREATE TABLE log.message_refs ( ref_type log.ref_type NOT NULL, position INT NOT NULL, thread_hash CHAR(64), - UNIQUE(message_hash, ref_hash) + UNIQUE(message_hash, ref_hash, ref_type) ); +-- Índices message_refs CREATE INDEX idx_refs_message ON log.message_refs(message_hash); CREATE INDEX idx_refs_ref ON log.message_refs(ref_hash); CREATE INDEX idx_refs_type ON log.message_refs(ref_type); @@ -89,7 +94,7 @@ END; $$ LANGUAGE plpgsql; -- ============================================ --- Triggers de protección +-- Triggers de protección (inmutabilidad) -- ============================================ CREATE TRIGGER protect_messages_update BEFORE UPDATE ON log.messages FOR EACH ROW EXECUTE FUNCTION log.prevent_update(); @@ -110,4 +115,5 @@ GRANT SELECT, INSERT ON log.message_refs TO tzzr; GRANT USAGE ON SEQUENCE log.messages_id_seq TO tzzr; GRANT USAGE ON SEQUENCE log.message_refs_id_seq TO tzzr; -SELECT 'Schema log: 2 tablas creadas' as status; +-- Verificación +SELECT 'Schema log v2.0: 2 tablas creadas' as status;