Files
einsamerwolfdh/database/schema.sql
T
dustinandClaude Haiku 4.5 b2f9762afd Initial project setup: Obsidian vault, PostgreSQL schema, project structure
- 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>
2026-08-16 23:03:35 +02:00

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;