-- Пользователи, корзина, заказы CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL DEFAULT '', phone VARCHAR(50) NOT NULL DEFAULT '', address TEXT NOT NULL DEFAULT '', created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS carts ( id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id) ON DELETE CASCADE, session_key VARCHAR(64) NOT NULL DEFAULT '', updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE UNIQUE INDEX IF NOT EXISTS idx_carts_user ON carts (user_id) WHERE user_id IS NOT NULL; CREATE UNIQUE INDEX IF NOT EXISTS idx_carts_session ON carts (session_key) WHERE user_id IS NULL; CREATE TABLE IF NOT EXISTS cart_items ( id SERIAL PRIMARY KEY, cart_id INT NOT NULL REFERENCES carts(id) ON DELETE CASCADE, product_id INT NOT NULL REFERENCES products(id) ON DELETE CASCADE, quantity INT NOT NULL DEFAULT 1 CHECK (quantity > 0), UNIQUE (cart_id, product_id) ); CREATE TABLE IF NOT EXISTS orders ( id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id) ON DELETE SET NULL, guest_name VARCHAR(255) NOT NULL DEFAULT '', guest_email VARCHAR(255) NOT NULL DEFAULT '', guest_phone VARCHAR(50) NOT NULL DEFAULT '', address TEXT NOT NULL DEFAULT '', total NUMERIC(10, 2) NOT NULL DEFAULT 0, status VARCHAR(50) NOT NULL DEFAULT 'new', created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS order_items ( id SERIAL PRIMARY KEY, order_id INT NOT NULL REFERENCES orders(id) ON DELETE CASCADE, product_id INT NOT NULL, product_name VARCHAR(255) NOT NULL, price NUMERIC(10, 2) NOT NULL, quantity INT NOT NULL CHECK (quantity > 0) ); CREATE INDEX IF NOT EXISTS idx_orders_user ON orders (user_id);