60 lines
2.1 KiB
SQL
60 lines
2.1 KiB
SQL
-- =====================================================
|
|
-- 001_initial.sql — начальная схема БД для лендинга
|
|
-- =====================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS admin_users (
|
|
id SERIAL PRIMARY KEY,
|
|
login VARCHAR(64) UNIQUE NOT NULL,
|
|
password_hash TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
last_login TIMESTAMPTZ
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS sections (
|
|
id SERIAL PRIMARY KEY,
|
|
key VARCHAR(64) UNIQUE NOT NULL,
|
|
title TEXT NOT NULL,
|
|
content_json JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS products (
|
|
id SERIAL PRIMARY KEY,
|
|
slug VARCHAR(64) UNIQUE NOT NULL,
|
|
title VARCHAR(128) NOT NULL,
|
|
subtitle VARCHAR(256),
|
|
description TEXT NOT NULL,
|
|
status VARCHAR(32) NOT NULL DEFAULT 'production',
|
|
audience VARCHAR(32),
|
|
icon_key VARCHAR(64),
|
|
tags JSONB NOT NULL DEFAULT '[]'::jsonb,
|
|
is_published BOOLEAN NOT NULL DEFAULT true,
|
|
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS approach_items (
|
|
id SERIAL PRIMARY KEY,
|
|
title VARCHAR(128) NOT NULL,
|
|
description TEXT NOT NULL,
|
|
icon_key VARCHAR(64),
|
|
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
is_active BOOLEAN NOT NULL DEFAULT true
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS settings (
|
|
key VARCHAR(64) PRIMARY KEY,
|
|
value TEXT NOT NULL,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_products_published_sorted
|
|
ON products(is_published, sort_order) WHERE is_published = true;
|
|
CREATE INDEX IF NOT EXISTS idx_sections_active_sorted
|
|
ON sections(is_active, sort_order) WHERE is_active = true;
|
|
CREATE INDEX IF NOT EXISTS idx_approach_active_sorted
|
|
ON approach_items(is_active, sort_order) WHERE is_active = true;
|