Шаг 2. Бизнес-схема и тестовые данные
-- 2.1 Таблицы
CREATE TABLE customers (
customer_id BIGSERIAL PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
full_name TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE products (
product_id BIGSERIAL PRIMARY KEY,
sku TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
price_cents INTEGER NOT NULL CHECK (price_cents >= 0),
active BOOLEAN NOT NULL DEFAULT TRUE
);
CREATE TABLE orders (
order_id BIGSERIAL PRIMARY KEY,
customer_id BIGINT NOT NULL REFERENCES customers(customer_id),
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
total_cents INTEGER NOT NULL CHECK (total_cents >= 0)
);
CREATE TABLE order_items (
order_id BIGINT NOT NULL REFERENCES orders(order_id) ON DELETE CASCADE,
product_id BIGINT NOT NULL REFERENCES products(product_id),
qty INTEGER NOT NULL CHECK (qty > 0),
price_cents INTEGER NOT NULL CHECK (price_cents >= 0),
PRIMARY KEY (order_id, product_id)
);
-- 2.2 Индексы (пример)
CREATE INDEX idx_orders_customer ON orders(customer_id);
CREATE INDEX idx_order_items_product ON order_items(product_id);
-- 2.3 Данные
INSERT INTO customers (email, full_name) VALUES
('
alice@example.com','Alice A.'), ('
bob@example.com','Bob B.');
INSERT INTO products (sku, name, price_cents) VALUES
('SKU-1','Keyboard', 3999), ('SKU-2','Mouse', 1999), ('SKU-3','Monitor', 12999);
-- Заказ с позициями
INSERT INTO orders (customer_id, total_cents)
VALUES ( (SELECT customer_id FROM customers WHERE email='
alice@example.com'), 0 )
RETURNING order_id;
-- Подставьте полученный order_id вручную или через CTE:
WITH new_order AS (
INSERT INTO orders (customer_id, total_cents)
VALUES ((SELECT customer_id FROM customers WHERE email='
bob@example.com'), 0)
RETURNING order_id
)
INSERT INTO order_items (order_id, product_id, qty, price_cents)
SELECT order_id, p.product_id, 2, p.price_cents
FROM new_order, products p
WHERE p.sku IN ('SKU-1','SKU-2');
-- Пересчёт итога (как пример UPDATE с агрегированием)
UPDATE orders o
SET total_cents = sub.sum_cents
FROM (
SELECT order_id, SUM(qty * price_cents) AS sum_cents
FROM order_items GROUP BY order_id
) sub
WHERE o.order_id = sub.order_id;
Примечание: дополнительно создать и выполнить несколько своих оригинальных запросов - скрины приложить
Примечание 2: создать и выполнить запросы для проверки результата, скрины приложить