f24f35d0fc
Co-authored-by: Cursor <cursoragent@cursor.com>
57 lines
1.8 KiB
SQL
57 lines
1.8 KiB
SQL
-- PostgreSQL 17 — схема магазина
|
|
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id SERIAL PRIMARY KEY,
|
|
email TEXT NOT NULL UNIQUE,
|
|
password_hash TEXT NOT NULL,
|
|
name TEXT NOT NULL,
|
|
role TEXT NOT NULL DEFAULT 'customer'
|
|
CHECK (role IN ('customer', 'admin')),
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_users_role ON users(role);
|
|
|
|
CREATE TABLE IF NOT EXISTS categories (
|
|
id SERIAL PRIMARY KEY,
|
|
slug TEXT NOT NULL UNIQUE,
|
|
name TEXT NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS products (
|
|
id SERIAL PRIMARY KEY,
|
|
category_id INTEGER REFERENCES categories(id) ON DELETE SET NULL,
|
|
slug TEXT NOT NULL UNIQUE,
|
|
name TEXT NOT NULL,
|
|
description TEXT NOT NULL DEFAULT '',
|
|
price_cents INTEGER NOT NULL CHECK (price_cents >= 0),
|
|
stock INTEGER NOT NULL DEFAULT 0 CHECK (stock >= 0),
|
|
image_url TEXT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS orders (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
status TEXT NOT NULL DEFAULT 'pending'
|
|
CHECK (status IN ('pending', 'paid', 'shipped', 'cancelled')),
|
|
total_cents INTEGER NOT NULL CHECK (total_cents >= 0),
|
|
customer_name TEXT NOT NULL,
|
|
customer_email TEXT NOT NULL,
|
|
customer_phone TEXT NOT NULL DEFAULT '',
|
|
address TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS order_items (
|
|
id SERIAL PRIMARY KEY,
|
|
order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
|
|
product_id INTEGER NOT NULL REFERENCES products(id),
|
|
quantity INTEGER NOT NULL CHECK (quantity > 0),
|
|
price_cents INTEGER NOT NULL CHECK (price_cents >= 0)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_products_category ON products(category_id);
|
|
CREATE INDEX IF NOT EXISTS idx_orders_user ON orders(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_products_name ON products(name);
|