← back to Costa Rica
schema.sql
74 lines
-- Costa Rica multi-vertical directory schema
-- Ventura-Corridor pattern: tourism + rentals + local services
CREATE TABLE IF NOT EXISTS regions (
id SERIAL PRIMARY KEY,
slug TEXT UNIQUE NOT NULL,
name TEXT NOT NULL,
province TEXT NOT NULL,
region_type TEXT NOT NULL DEFAULT 'town',
description TEXT,
lat NUMERIC(9,6),
lng NUMERIC(9,6)
);
CREATE TABLE IF NOT EXISTS places (
id SERIAL PRIMARY KEY,
slug TEXT UNIQUE NOT NULL,
name TEXT NOT NULL,
category TEXT NOT NULL CHECK (category IN ('tourism','rentals','service')),
vertical TEXT NOT NULL,
region_id INTEGER REFERENCES regions(id),
description TEXT,
address TEXT,
phone TEXT,
email TEXT,
website TEXT,
price_range TEXT,
rating NUMERIC(2,1),
image_url TEXT,
tags TEXT[],
lat NUMERIC(9,6),
lng NUMERIC(9,6),
cedula_juridica TEXT,
source TEXT,
source_url TEXT,
verified BOOLEAN DEFAULT FALSE,
status TEXT DEFAULT 'active',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_places_vertical ON places(vertical);
CREATE INDEX IF NOT EXISTS idx_places_category ON places(category);
CREATE INDEX IF NOT EXISTS idx_places_region ON places(region_id);
CREATE INDEX IF NOT EXISTS idx_places_name_lower ON places(LOWER(name));
CREATE INDEX IF NOT EXISTS idx_places_status ON places(status);
CREATE TABLE IF NOT EXISTS leads (
id SERIAL PRIMARY KEY,
place_id INTEGER REFERENCES places(id),
name TEXT,
email TEXT,
phone TEXT,
message TEXT,
meta JSONB,
ip TEXT,
user_agent TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_leads_place ON leads(place_id);
CREATE TABLE IF NOT EXISTS ingest_runs (
id SERIAL PRIMARY KEY,
source TEXT NOT NULL,
started_at TIMESTAMPTZ DEFAULT NOW(),
finished_at TIMESTAMPTZ,
rows_in INTEGER,
rows_added INTEGER,
rows_updated INTEGER,
status TEXT,
notes TEXT
);