conventions
SQL schema conventions for PSRDatabase. When writing SQL schemas for PSRDatabase, follow these conventions strictly.
When & Why to Use This Skill
This Claude skill provides a comprehensive set of SQL schema conventions and structural requirements specifically tailored for PSRDatabase. It ensures database consistency, integrity, and performance by enforcing strict naming patterns, mandatory table structures, and standardized relations for complex data types such as vectors, sets, and time series.
Use Cases
- Standardizing Database Architecture: Use these conventions to create consistent, error-free SQL schemas for PSRDatabase projects, ensuring all tables follow the PascalCase singular naming rule and include the STRICT keyword.
- Schema Validation and Auditing: Review existing database designs to identify and correct common mistakes, such as plural table names, missing foreign key cascades, or incorrect primary key configurations in specialized tables.
- Implementing Specialized Data Structures: Provide precise guidance on configuring complex attributes, including vector tables with mandatory indices and time-series tables with specific primary key requirements.
| name | conventions |
|---|---|
| description | SQL schema conventions for PSRDatabase. When writing SQL schemas for PSRDatabase, follow these conventions strictly. |
Collections (Tables)
Naming:
- Table name = Collection name
- Use PascalCase (e.g.,
ThermalPlant,GaugingStation) - Always singular form (not plural)
Required structure:
- Must have
id INTEGER PRIMARY KEY AUTOINCREMENT - Must end with
STRICT - Every database must have a
Configurationtable
CREATE TABLE CollectionName (
id INTEGER PRIMARY KEY AUTOINCREMENT,
-- columns here
) STRICT;
Scalar Attributes
Naming:
- Use snake_case (e.g.,
minimum_generation,some_example_value) - Singular form
Special columns:
label: Must beTEXT UNIQUE NOT NULLdate_*columns: Must beTEXT(mapped to DateTime)
Relations to other collections:
- Format:
targetcollection_relationtype(e.g.,gaugingstation_id,plant_spill_to) - Type:
INTEGER(neverNOT NULL) - Must have foreign key with
ON UPDATE CASCADE ON DELETE CASCADE - Self-referential relations use
ON UPDATE SET NULL ON DELETE CASCADE
CREATE TABLE Plant(
id INTEGER PRIMARY KEY AUTOINCREMENT,
label TEXT UNIQUE NOT NULL,
capacity REAL NOT NULL,
gaugingstation_id INTEGER,
plant_spill_to INTEGER,
FOREIGN KEY(gaugingstation_id) REFERENCES GaugingStation(id) ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY(plant_spill_to) REFERENCES Plant(id) ON UPDATE SET NULL ON DELETE CASCADE
) STRICT;
Vector Attributes
Table naming: COLLECTION_vector_GROUPNAME
Required structure:
- Column
id INTEGER(references parent) - Column
vector_index INTEGER NOT NULL - Primary key:
(id, vector_index) - Foreign key to parent collection with CASCADE
CREATE TABLE ThermalPlant_vector_costs(
id INTEGER,
vector_index INTEGER NOT NULL,
cost_value REAL NOT NULL,
FOREIGN KEY (id) REFERENCES ThermalPlant(id) ON UPDATE CASCADE ON DELETE CASCADE,
PRIMARY KEY (id, vector_index)
) STRICT;
Set Attributes
Table naming: COLLECTION_set_GROUPNAME
Required structure:
- Column
id INTEGER(references parent) - NO primary key
- UNIQUE constraint on ALL columns combined
CREATE TABLE HydroPlant_set_gaugingstations(
id INTEGER,
conversion_factor REAL NOT NULL,
gaugingstation_id INTEGER,
FOREIGN KEY (gaugingstation_id) REFERENCES GaugingStation(id) ON UPDATE CASCADE ON DELETE CASCADE,
UNIQUE (id, conversion_factor, gaugingstation_id)
) STRICT;
Time Series
Table naming: COLLECTION_time_series_GROUPNAME
Required structure:
- Column
id INTEGER(references parent) - Column
date_time TEXT NOT NULL - Primary key:
(id, date_time) - Foreign key to parent collection with CASCADE
CREATE TABLE Resource_time_series_generation (
id INTEGER,
date_time TEXT NOT NULL,
power_output REAL,
efficiency REAL,
FOREIGN KEY(id) REFERENCES Resource(id) ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY (id, date_time)
) STRICT;
Time Series Files
Table naming: COLLECTION_time_series_files
Structure:
- Each column stores a file path as
TEXT - Column names = attribute names
CREATE TABLE Plant_time_series_files (
generation TEXT,
cost TEXT
) STRICT;
Quick Reference
| Element | Naming Pattern | Key Points |
|---|---|---|
| Collection | PascalCase singular |
id INTEGER PRIMARY KEY AUTOINCREMENT, STRICT |
| Attribute | snake_case singular |
label is TEXT UNIQUE NOT NULL |
| Relation | collection_relationtype |
INTEGER, nullable, CASCADE |
| Vector table | Collection_vector_group |
PK: (id, vector_index) |
| Set table | Collection_set_group |
No PK, UNIQUE on all columns |
| Time series | Collection_time_series_group |
PK: (id, date_time) |
| TS files | Collection_time_series_files |
Columns store file paths |
Common Mistakes to Avoid
- Using plural table names (wrong:
Plants, right:Plant) - Forgetting
STRICTat the end - Making relation columns
NOT NULL - Using
ON DELETE SET NULLfor non-self-referential relations - Forgetting
vector_indexin vector tables - Adding primary key to set tables
- Using camelCase for attributes (use snake_case)