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>
This commit is contained in:
@@ -0,0 +1,200 @@
|
||||
-- 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;
|
||||
Reference in New Issue
Block a user