Files
db_design/schemas/core.sql
Sayakhfarov_RH 03e7f46cdb init
2026-02-09 18:36:51 +03:00

132 lines
6.8 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
CREATE SCHEMA IF NOT EXISTS shop;
------------------------------------------------------------
-- 1. Таблицы-справочники и основные сущности
------------------------------------------------------------
-- 1.1. Клиенты
CREATE TABLE shop.client (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
address TEXT
);
COMMENT ON TABLE shop.client IS 'Таблица клиентов магазина';
COMMENT ON COLUMN shop.client.id IS 'Уникальный идентификатор клиента';
COMMENT ON COLUMN shop.client.name IS 'Имя или наименование клиента';
COMMENT ON COLUMN shop.client.address IS 'Адрес клиента';
------------------------------------------------------------
-- 1.2. Категории (основная таблица)
------------------------------------------------------------
CREATE TABLE shop.category (
id BIGSERIAL PRIMARY KEY,
parent_id BIGINT REFERENCES shop.category(id) ON DELETE SET NULL,
name TEXT NOT NULL
);
CREATE INDEX idx_category_parent_id ON shop.category(parent_id);
COMMENT ON TABLE shop.category IS 'Таблица категорий товаров (иерархическая структура)';
COMMENT ON COLUMN shop.category.id IS 'Уникальный идентификатор категории';
COMMENT ON COLUMN shop.category.parent_id IS 'Ссылка на родительскую категорию (NULL для корневых категорий)';
COMMENT ON COLUMN shop.category.name IS 'Наименование категории';
------------------------------------------------------------
-- 1.3. Closure Table для категорий
------------------------------------------------------------
CREATE TABLE shop.category_closure (
ancestor_id BIGINT NOT NULL REFERENCES shop.category(id) ON DELETE CASCADE,
descendant_id BIGINT NOT NULL REFERENCES shop.category(id) ON DELETE CASCADE,
depth INT NOT NULL,
PRIMARY KEY (ancestor_id, descendant_id)
);
-- Быстрый поиск всех потомков (по предку)
CREATE INDEX idx_category_closure_ancestor_depth
ON shop.category_closure (ancestor_id, depth);
-- Быстрый поиск всех предков (по потомку)
CREATE INDEX idx_category_closure_descendant_depth
ON shop.category_closure (descendant_id, depth);
COMMENT ON TABLE shop.category_closure IS 'Closure Table для эффективной работы с иерархией категорий';
COMMENT ON COLUMN shop.category_closure.ancestor_id IS 'ID категории-предка в иерархии';
COMMENT ON COLUMN shop.category_closure.descendant_id IS 'ID категории-потомка в иерархии';
COMMENT ON COLUMN shop.category_closure.depth IS 'Глубина связи: 0 - сам себе предок, 1 - прямой потомок, 2+ - непрямой потомок';
------------------------------------------------------------
-- 1.4. Номенклатура (товары)
------------------------------------------------------------
CREATE TABLE shop.product (
id BIGSERIAL PRIMARY KEY,
category_id BIGINT NOT NULL REFERENCES shop.category(id) ON DELETE RESTRICT,
name TEXT NOT NULL,
quantity NUMERIC(18,3) NOT NULL DEFAULT 0,
price NUMERIC(18,2) NOT NULL
);
CREATE INDEX idx_product_category_id ON shop.product(category_id);
COMMENT ON TABLE shop.product IS 'Таблица товаров (номенклатура)';
COMMENT ON COLUMN shop.product.id IS 'Уникальный идентификатор товара';
COMMENT ON COLUMN shop.product.category_id IS 'Ссылка на категорию товара';
COMMENT ON COLUMN shop.product.name IS 'Наименование товара';
COMMENT ON COLUMN shop.product.quantity IS 'Количество товара на складе';
COMMENT ON COLUMN shop.product.price IS 'Цена товара';
------------------------------------------------------------
-- 1.5. Заказы
------------------------------------------------------------
CREATE TABLE shop.customer_order (
id BIGSERIAL PRIMARY KEY,
client_id BIGINT NOT NULL REFERENCES shop.client(id) ON DELETE RESTRICT,
order_date TIMESTAMP NOT NULL DEFAULT NOW(),
status TEXT NOT NULL DEFAULT 'NEW'
);
CREATE INDEX idx_customer_order_client_id ON shop.customer_order(client_id);
CREATE INDEX idx_customer_order_order_date ON shop.customer_order(order_date);
COMMENT ON TABLE shop.customer_order IS 'Таблица заказов клиентов';
COMMENT ON COLUMN shop.customer_order.id IS 'Уникальный идентификатор заказа';
COMMENT ON COLUMN shop.customer_order.client_id IS 'Ссылка на клиента, сделавшего заказ';
COMMENT ON COLUMN shop.customer_order.order_date IS 'Дата и время создания заказа (по умолчанию - текущее время)';
COMMENT ON COLUMN shop.customer_order.status IS 'Статус заказа: NEW - новый, и другие возможные статусы';
------------------------------------------------------------
-- 1.6. Позиции заказа
------------------------------------------------------------
CREATE TABLE shop.customer_order_item (
id BIGSERIAL PRIMARY KEY,
order_id BIGINT NOT NULL REFERENCES shop.customer_order(id) ON DELETE CASCADE,
product_id BIGINT NOT NULL REFERENCES shop.product(id) ON DELETE RESTRICT,
quantity NUMERIC(18,3) NOT NULL,
price_at_time NUMERIC(18,2) NOT NULL,
-- один товар одна позиция в заказе
UNIQUE (order_id, product_id)
);
CREATE INDEX idx_order_item_order_id ON shop.customer_order_item(order_id);
CREATE INDEX idx_order_item_product_id ON shop.customer_order_item(product_id);
COMMENT ON TABLE shop.customer_order_item IS 'Таблица позиций (состав) заказов';
COMMENT ON COLUMN shop.customer_order_item.id IS 'Уникальный идентификатор позиции в заказе';
COMMENT ON COLUMN shop.customer_order_item.order_id IS 'Ссылка на заказ, к которому относится позиция';
COMMENT ON COLUMN shop.customer_order_item.product_id IS 'Ссылка на товар в позиции заказа';
COMMENT ON COLUMN shop.customer_order_item.quantity IS 'Количество товара в позиции';
COMMENT ON COLUMN shop.customer_order_item.price_at_time IS 'Цена товара на момент создания заказа (фиксируется при оформлении)';