-- SDSO Wiki PostgreSQL Schema -- Characters Table CREATE TABLE characters ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL UNIQUE, title VARCHAR(255), race VARCHAR(100), faction VARCHAR(100), status VARCHAR(100), description TEXT, appearance TEXT, first_appearance VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Character Stats CREATE TABLE character_stats ( id SERIAL PRIMARY KEY, character_id INT NOT NULL REFERENCES characters(id) ON DELETE CASCADE, hp INT, mp INT, strength INT, endurance INT, magic INT, speed INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Items Table CREATE TABLE items ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL UNIQUE, item_type VARCHAR(50) NOT NULL, -- weapon, armor, accessory, material rarity VARCHAR(50), description TEXT, origin TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Item Stats CREATE TABLE item_stats ( id SERIAL PRIMARY KEY, item_id INT NOT NULL REFERENCES items(id) ON DELETE CASCADE, attack INT, defense INT, magic_bonus INT, special_effect TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Character Equipment CREATE TABLE character_equipment ( id SERIAL PRIMARY KEY, character_id INT NOT NULL REFERENCES characters(id) ON DELETE CASCADE, item_id INT NOT NULL REFERENCES items(id) ON DELETE CASCADE, slot_type VARCHAR(50), -- weapon, armor, accessory equipped_from VARCHAR(100), equipped_until VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Resources Table CREATE TABLE resources ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL UNIQUE, resource_type VARCHAR(100), -- material, crafting_ingredient, etc description TEXT, rarity VARCHAR(50), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Item Requirements (Crafting/Obtaining) CREATE TABLE item_requirements ( id SERIAL PRIMARY KEY, item_id INT NOT NULL REFERENCES items(id) ON DELETE CASCADE, resource_id INT NOT NULL REFERENCES resources(id) ON DELETE CASCADE, quantity INT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(item_id, resource_id) ); -- Episodes Table CREATE TABLE episodes ( id SERIAL PRIMARY KEY, season INT NOT NULL, episode_number INT NOT NULL, title VARCHAR(255) NOT NULL, air_date DATE, manga_chapter VARCHAR(100), summary TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(season, episode_number) ); -- Locations Table CREATE TABLE locations ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL UNIQUE, region VARCHAR(100), location_type VARCHAR(100), -- city, castle, dungeon, nature, etc lat FLOAT, -- For interactive map lng FLOAT, size VARCHAR(100), population VARCHAR(100), description TEXT, geography TEXT, accessible_from VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Character Relationships CREATE TABLE relationships ( id SERIAL PRIMARY KEY, character_a_id INT NOT NULL REFERENCES characters(id) ON DELETE CASCADE, character_b_id INT NOT NULL REFERENCES characters(id) ON DELETE CASCADE, relationship_type VARCHAR(100), -- ally, enemy, family, romance, etc description TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(character_a_id, character_b_id) ); -- Episode Characters (Many-to-Many) CREATE TABLE episode_characters ( id SERIAL PRIMARY KEY, episode_id INT NOT NULL REFERENCES episodes(id) ON DELETE CASCADE, character_id INT NOT NULL REFERENCES characters(id) ON DELETE CASCADE, role VARCHAR(100), -- main, supporting, cameo created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(episode_id, character_id) ); -- Episode Locations (Many-to-Many) CREATE TABLE episode_locations ( id SERIAL PRIMARY KEY, episode_id INT NOT NULL REFERENCES episodes(id) ON DELETE CASCADE, location_id INT NOT NULL REFERENCES locations(id) ON DELETE CASCADE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(episode_id, location_id) ); -- Episode Items (Many-to-Many) CREATE TABLE episode_items ( id SERIAL PRIMARY KEY, episode_id INT NOT NULL REFERENCES episodes(id) ON DELETE CASCADE, item_id INT NOT NULL REFERENCES items(id) ON DELETE CASCADE, significance VARCHAR(100), -- introduced, featured, used, etc created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(episode_id, item_id) ); -- Story Arcs CREATE TABLE story_arcs ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL UNIQUE, description TEXT, start_episode INT, end_episode INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Story Arc Episodes (Many-to-Many) CREATE TABLE story_arc_episodes ( id SERIAL PRIMARY KEY, arc_id INT NOT NULL REFERENCES story_arcs(id) ON DELETE CASCADE, episode_id INT NOT NULL REFERENCES episodes(id) ON DELETE CASCADE, arc_order INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Lore/World Building CREATE TABLE lore ( id SERIAL PRIMARY KEY, title VARCHAR(255) NOT NULL UNIQUE, category VARCHAR(100), -- faction, magic_system, history, etc content TEXT, related_characters TEXT, -- JSON array of character IDs created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Create Indexes for Performance CREATE INDEX idx_characters_faction ON characters(faction); CREATE INDEX idx_items_type ON items(item_type); CREATE INDEX idx_episodes_season ON episodes(season); CREATE INDEX idx_locations_region ON locations(region); CREATE INDEX idx_relationships_character ON relationships(character_a_id, character_b_id); CREATE INDEX idx_episode_characters_episode ON episode_characters(episode_id); CREATE INDEX idx_episode_characters_character ON episode_characters(character_id); CREATE INDEX idx_item_requirements_item ON item_requirements(item_id); CREATE INDEX idx_item_requirements_resource ON item_requirements(resource_id); -- Enable Full Text Search (optional) ALTER TABLE characters ADD COLUMN search_vector TSVECTOR; ALTER TABLE items ADD COLUMN search_vector TSVECTOR; ALTER TABLE locations ADD COLUMN search_vector TSVECTOR;