Шаг 2. Бизнес-схема и тестовые данные

Шаг 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: создать и выполнить запросы для проверки результата, скрины приложить
Автор: к.п.н., Румянцев Сергей Александрович, доцент Финансового университета при Правительстве РФ; доцент ОЧУВО Международного инновационного университета; Консалтинг, управление разработкой ПО; системный и бизнес анализ; менеджмент; аналитиз данных; управление ИТ. Телефон для связи +79269444818 (мессенджеры)   Короткая ссылка:
Шаг 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: создать и выполнить запросы для проверки результата, скрины приложить
https://webprogr.ru/~IiWQe
Короткая ссылка на новость:https://webprogr.ru/~IiWQe


// Пример кода
function hello(name) {
  console.log(`Hi, ${name}!`);
}
hello("Sergey");

Последние новости

Рейтинг@Mail.ru