- Set up Obsidian vault with wiki structure (Characters, Episodes, Items, Locations, Lore) - Created PostgreSQL schema with all necessary tables (characters, items, locations, episodes, relationships) - Added git config and .gitignore - Created project documentation (README, CLAUDE.md) - Added environment example file - Prepared Docker Compose for PostgreSQL Ready for Phase 1 implementation. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
201 lines
6.4 KiB
SQL
201 lines
6.4 KiB
SQL
-- 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;
|