40275-vm/data/geoseek/geo_database.sql
2026-06-18 04:12:14 +00:00

66 lines
2.0 KiB
SQL

-- GeoSeek database draft for PostgreSQL.
-- This file is intentionally schema-only; do not run on production before adapting migrations.
CREATE TABLE IF NOT EXISTS geo_categories (
id BIGSERIAL PRIMARY KEY,
kategori TEXT NOT NULL UNIQUE,
subkategori_default TEXT,
target_total INTEGER DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS geo_regions (
id BIGSERIAL PRIMARY KEY,
provinsi TEXT NOT NULL,
kota TEXT NOT NULL,
kecamatan TEXT,
kelurahan TEXT,
latitude NUMERIC(10, 7),
longitude NUMERIC(10, 7),
sumber_data TEXT DEFAULT 'GeoSeek',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS geo_places (
id BIGSERIAL PRIMARY KEY,
nama_tempat TEXT NOT NULL,
kategori TEXT NOT NULL,
subkategori TEXT,
alamat TEXT,
kecamatan TEXT,
kota TEXT,
provinsi TEXT,
latitude NUMERIC(10, 7),
longitude NUMERIC(10, 7),
no_telp TEXT,
jam_operasional TEXT,
rating NUMERIC(2, 1),
jumlah_review INTEGER DEFAULT 0,
sumber_data TEXT NOT NULL DEFAULT 'GeoSeek',
status_verifikasi TEXT NOT NULL DEFAULT 'unverified',
status TEXT NOT NULL DEFAULT 'aktif',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_geo_places_keyword
ON geo_places USING GIN (to_tsvector('simple', coalesce(nama_tempat, '') || ' ' || coalesce(kategori, '') || ' ' || coalesce(subkategori, '') || ' ' || coalesce(alamat, '')));
CREATE INDEX IF NOT EXISTS idx_geo_places_location
ON geo_places (latitude, longitude);
CREATE INDEX IF NOT EXISTS idx_geo_places_region
ON geo_places (provinsi, kota, kecamatan);
CREATE TABLE IF NOT EXISTS geo_reviews (
id BIGSERIAL PRIMARY KEY,
place_id BIGINT NOT NULL REFERENCES geo_places(id) ON DELETE CASCADE,
user_id UUID,
rating NUMERIC(2, 1),
comment TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);