239 lines
8.8 KiB
SQL
239 lines
8.8 KiB
SQL
-- =============================================================================
|
|
-- SCHEMA COMPLETO PER CATALOGO CELEBRITÀ
|
|
-- VERSIONE: 4.2
|
|
-- DESCRIZIONE: Schema base con espansione della taglia del reggiseno e
|
|
-- aggiunta della cronologia degli interventi estetici.
|
|
-- DATABASE: PostgreSQL
|
|
-- =============================================================================
|
|
|
|
-- PREPARAZIONE: Elimina vecchie strutture per una creazione pulita
|
|
DROP TABLE IF EXISTS
|
|
cosmetic_surgeries,
|
|
activity_periods,
|
|
celebrity_aliases,
|
|
tattoos,
|
|
video_performers,
|
|
videos,
|
|
celebrity_studios,
|
|
studios,
|
|
external_links,
|
|
images,
|
|
social_media_accounts,
|
|
celebrity_professions,
|
|
professions,
|
|
celebrities CASCADE;
|
|
|
|
DROP TYPE IF EXISTS GENDER_TYPE;
|
|
DROP TYPE IF EXISTS SHOE_SYSTEM_TYPE;
|
|
DROP TYPE IF EXISTS BRA_SYSTEM_TYPE;
|
|
DROP TYPE IF EXISTS SURGERY_TYPE;
|
|
|
|
-- =============================================================================
|
|
-- DEFINIZIONE DEI TIPI PERSONALIZZATI (ENUMs)
|
|
-- =============================================================================
|
|
|
|
CREATE TYPE GENDER_TYPE AS ENUM ('male', 'female', 'other');
|
|
CREATE TYPE SHOE_SYSTEM_TYPE AS ENUM ('EU', 'US', 'UK');
|
|
CREATE TYPE BRA_SYSTEM_TYPE AS ENUM ('US', 'UK', 'EU', 'FR', 'AU', 'IT', 'JP');
|
|
CREATE TYPE SURGERY_TYPE AS ENUM (
|
|
'breast_reduction',
|
|
'breast_augmentation',
|
|
'breast_lift',
|
|
'rhinoplasty',
|
|
'other'
|
|
);
|
|
|
|
-- =============================================================================
|
|
-- TABELLE PRINCIPALI
|
|
-- =============================================================================
|
|
|
|
-- Tabella centrale che contiene tutte le informazioni anagrafiche e fisiche
|
|
-- I dati fisici (es. taglia reggiseno) rappresentano lo STATO ATTUALE della celebrità.
|
|
CREATE TABLE celebrities (
|
|
id SERIAL PRIMARY KEY,
|
|
name TEXT NOT NULL UNIQUE,
|
|
gender GENDER_TYPE NOT NULL,
|
|
birth_date DATE,
|
|
birth_place TEXT,
|
|
nationality TEXT,
|
|
ethnicity TEXT,
|
|
sexuality TEXT,
|
|
|
|
-- Dati fisici (Misure standardizzate in unità metriche per coerenza)
|
|
hair_color TEXT,
|
|
eye_color TEXT,
|
|
height_cm INT CHECK (height_cm > 0),
|
|
weight_kg INT CHECK (weight_kg > 0),
|
|
body_type TEXT,
|
|
|
|
-- Misure femminili (in cm). NULL se non applicabile.
|
|
bust_cm INT CHECK (bust_cm > 0),
|
|
waist_cm INT CHECK (waist_cm > 0),
|
|
hips_cm INT CHECK (hips_cm > 0),
|
|
|
|
-- Misure maschili (in cm). NULL se non applicabile.
|
|
chest_circumference_cm INT CHECK (chest_circumference_cm > 0),
|
|
|
|
-- Campi strutturati per la taglia del reggiseno (stato attuale)
|
|
bra_band_size INT CHECK (bra_band_size > 0), -- Es: 34 (per US/UK) o 75 (per EU)
|
|
bra_cup_size TEXT, -- Es: 'C', 'DD', 'E'
|
|
bra_size_system BRA_SYSTEM_TYPE, -- Sistema di riferimento (US, EU, UK, etc.)
|
|
|
|
boobs_are_natural BOOLEAN,
|
|
shoe_size DECIMAL(4, 1),
|
|
shoe_size_system SHOE_SYSTEM_TYPE,
|
|
|
|
-- Dati biografici
|
|
biography TEXT,
|
|
|
|
-- Metadati e relazioni
|
|
official_website TEXT,
|
|
profile_image_id INT, -- Riferimento all'immagine del profilo (vedi tabella images)
|
|
|
|
-- Timestamp per tracciamento
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- Tabella per i tatuaggi (Relazione 1-a-Molti con celebrities)
|
|
CREATE TABLE tattoos (
|
|
id SERIAL PRIMARY KEY,
|
|
celebrity_id INT NOT NULL REFERENCES celebrities(id) ON DELETE CASCADE,
|
|
description TEXT NOT NULL,
|
|
body_location TEXT
|
|
);
|
|
|
|
-- Tabella per gli alias (Relazione 1-a-Molti con celebrities)
|
|
CREATE TABLE celebrity_aliases (
|
|
id SERIAL PRIMARY KEY,
|
|
celebrity_id INT NOT NULL REFERENCES celebrities(id) ON DELETE CASCADE,
|
|
alias_name TEXT NOT NULL,
|
|
UNIQUE(celebrity_id, alias_name)
|
|
);
|
|
|
|
-- Tabella per i periodi di attività (Relazione 1-a-Molti con celebrities)
|
|
CREATE TABLE activity_periods (
|
|
id SERIAL PRIMARY KEY,
|
|
celebrity_id INT NOT NULL REFERENCES celebrities(id) ON DELETE CASCADE,
|
|
start_year INT NOT NULL CHECK (start_year > 1900 AND start_year < 2100),
|
|
end_year INT CHECK (end_year >= start_year), -- Può essere NULL se ancora in attività per questo periodo
|
|
notes TEXT -- Es. "Carriera principale", "Ritorno sulle scene"
|
|
);
|
|
|
|
-- =============================================================================
|
|
-- TABELLE DI "LOOKUP" E DI COLLEGAMENTO (MOLTI-A-MOLTI)
|
|
-- =============================================================================
|
|
|
|
CREATE TABLE professions (
|
|
id SERIAL PRIMARY KEY,
|
|
name TEXT NOT NULL UNIQUE
|
|
);
|
|
CREATE TABLE celebrity_professions (
|
|
celebrity_id INT NOT NULL REFERENCES celebrities(id) ON DELETE CASCADE,
|
|
profession_id INT NOT NULL REFERENCES professions(id) ON DELETE CASCADE,
|
|
PRIMARY KEY (celebrity_id, profession_id)
|
|
);
|
|
|
|
CREATE TABLE studios (
|
|
id SERIAL PRIMARY KEY,
|
|
name TEXT NOT NULL UNIQUE
|
|
);
|
|
CREATE TABLE celebrity_studios (
|
|
celebrity_id INT NOT NULL REFERENCES celebrities(id) ON DELETE CASCADE,
|
|
studio_id INT NOT NULL REFERENCES studios(id) ON DELETE CASCADE,
|
|
PRIMARY KEY (celebrity_id, studio_id)
|
|
);
|
|
|
|
CREATE TABLE videos (
|
|
id SERIAL PRIMARY KEY,
|
|
title TEXT NOT NULL,
|
|
release_date DATE,
|
|
studio_id INT REFERENCES studios(id) ON DELETE SET NULL,
|
|
description TEXT,
|
|
url_preview TEXT
|
|
);
|
|
CREATE TABLE video_performers (
|
|
video_id INT NOT NULL REFERENCES videos(id) ON DELETE CASCADE,
|
|
celebrity_id INT NOT NULL REFERENCES celebrities(id) ON DELETE CASCADE,
|
|
PRIMARY KEY (video_id, celebrity_id)
|
|
);
|
|
|
|
-- =============================================================================
|
|
-- TABELLE SATELLITE (Informazioni aggiuntive)
|
|
-- =============================================================================
|
|
|
|
-- Tabella per tracciare la cronologia degli interventi estetici
|
|
CREATE TABLE cosmetic_surgeries (
|
|
id SERIAL PRIMARY KEY,
|
|
celebrity_id INT NOT NULL REFERENCES celebrities(id) ON DELETE CASCADE,
|
|
surgery_type SURGERY_TYPE NOT NULL,
|
|
surgery_date DATE, -- Data (anche approssimativa) dell'intervento
|
|
|
|
-- Campi specifici per interventi al seno (saranno NULL per altri tipi di intervento)
|
|
-- Rappresentano la taglia RISULTANTE dall'intervento
|
|
new_bra_band_size INT CHECK (new_bra_band_size > 0),
|
|
new_bra_cup_size TEXT,
|
|
new_bra_size_system BRA_SYSTEM_TYPE,
|
|
|
|
-- Campi generici
|
|
notes TEXT, -- Dettagli aggiuntivi (es. nome del medico, clinica, motivo dell'intervento)
|
|
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE social_media_accounts (
|
|
id SERIAL PRIMARY KEY,
|
|
celebrity_id INT NOT NULL REFERENCES celebrities(id) ON DELETE CASCADE,
|
|
platform TEXT NOT NULL,
|
|
url TEXT NOT NULL UNIQUE,
|
|
follower_count BIGINT,
|
|
last_checked_date DATE
|
|
);
|
|
|
|
CREATE TABLE images (
|
|
id SERIAL PRIMARY KEY,
|
|
celebrity_id INT NOT NULL REFERENCES celebrities(id) ON DELETE CASCADE,
|
|
file_path TEXT NOT NULL,
|
|
caption TEXT,
|
|
uploaded_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- Aggiunta del vincolo di chiave esterna per la foto profilo
|
|
-- Deve essere aggiunto dopo la creazione della tabella 'images'
|
|
ALTER TABLE celebrities
|
|
ADD CONSTRAINT fk_profile_image
|
|
FOREIGN KEY (profile_image_id) REFERENCES images(id) ON DELETE SET NULL;
|
|
|
|
CREATE TABLE external_links (
|
|
id SERIAL PRIMARY KEY,
|
|
celebrity_id INT NOT NULL REFERENCES celebrities(id) ON DELETE CASCADE,
|
|
url TEXT NOT NULL,
|
|
title TEXT,
|
|
source_website TEXT,
|
|
publication_date DATE
|
|
);
|
|
|
|
-- =============================================================================
|
|
-- CREAZIONE DEGLI INDICI PER MIGLIORARE LE PERFORMANCE
|
|
-- =============================================================================
|
|
|
|
-- Indici sulla tabella principale
|
|
CREATE INDEX idx_celebrities_name ON celebrities(name);
|
|
CREATE INDEX idx_celebrities_gender ON celebrities(gender);
|
|
|
|
-- Indici sulle chiavi esterne per accelerare i JOIN
|
|
CREATE INDEX idx_cosmetic_surgeries_celebrity_id ON cosmetic_surgeries(celebrity_id);
|
|
CREATE INDEX idx_tattoos_celebrity_id ON tattoos(celebrity_id);
|
|
CREATE INDEX idx_celebrity_aliases_celebrity_id ON celebrity_aliases(celebrity_id);
|
|
CREATE INDEX idx_celebrity_aliases_name ON celebrity_aliases(alias_name); -- Utile per cercare un alias
|
|
CREATE INDEX idx_activity_periods_celebrity_id ON activity_periods(celebrity_id);
|
|
CREATE INDEX idx_celebrity_professions_celebrity_id ON celebrity_professions(celebrity_id);
|
|
CREATE INDEX idx_celebrity_studios_celebrity_id ON celebrity_studios(celebrity_id);
|
|
CREATE INDEX idx_video_performers_celebrity_id ON video_performers(celebrity_id);
|
|
CREATE INDEX idx_social_media_celebrity_id ON social_media_accounts(celebrity_id);
|
|
CREATE INDEX idx_images_celebrity_id ON images(celebrity_id);
|
|
CREATE INDEX idx_external_links_celebrity_id ON external_links(celebrity_id);
|
|
|
|
-- =============================================================================
|
|
-- FINE DELLO SCRIPT
|
|
-- ============================================================================= |