Открыть
Сайт-визитка на гитхабе - github
Посмотреть запущенный сайт можно по ссылке.
Сотрудники
(с информацией: ID сотрудника, имя, фамилия, отчество, отдел)Департаменты
(с информацией: ID департамента, название, контактный телефон, контактная почта)Клиенты
(с информацией: ID клиента, название компании, контактное лицо, контактный телефон, ID менеджера, работающего с клиентом, адрес)Заказы
(с информацией: ID заказа, описание, товары, дата заказа, флаг самовывоза)Этапы заказов
(с информацией: ID этапа, ID заказа, исполнитель, даты начала и конца этапа)Продукты
(с информацией: ID товара, название, качество товара (номер ГОСТа), описание, цена единицы товара, количество на складе, вес единицы товара)
- В каждом департаменте не менее одного сотрудника (один ко многим).
- На каждом этапе у заказа свой работник-исполнитель. Работник одновременно может брать этапы разных заказов (один ко многим).
- У каждого клиента по одному менеджеру, привязанному к нему. Один менеджер может работать с несколькими клиентами (один ко многим).
- У каждого заказа несколько этапов, обрабатываемых в определенном порядке (один ко многим).
- Каждый заказ связан с одним клиентом, у клиента может быть много заказов (один ко многим).
- Каждый заказ содержит товары и каждый товар может быть в нескольких заказах (многие ко многим).
Модель находится в 3 нормальной форме:
- Атрибуты преобразованы к атомарным
- Каждая ячейка хранит только одно значение
- В колонках данные одного типа
- Все записи отличаются друг от друга
- Все неключевые атрибуты зависят от первичного ключа
- Никакие колонки не зависят друг от друга
В логической модели мы поддерживаем версионность адресов клиентов и для каждого заказа берем именно тот адрес, который был у него на момент заказа. Наш выбор - SCD типа 2, для которого мы заводим отдельную таблицу addresses, в которой храним id клиента и время начала и конца использования адреса.
Название | Описание | Тип данных | Ограничение |
---|---|---|---|
department_id |
Идентификатор отдела | SERIAL |
PRIMARY KEY |
name |
Название отдела | VARCHAR(50) |
NOT NULL |
phone |
Телефон отдела | CHAR(16) |
LIKE '+7(___)___-__-__' |
email |
Email отдела | VARCHAR(50) |
LIKE '%_@__%.__%' |
Название | Описание | Тип данных | Ограничение |
---|---|---|---|
worker_id |
Идентификатор работника | SERIAL |
PRIMARY KEY |
department_id |
Идентификатор отдела | INTEGER |
FOREIGN KEY |
name |
Имя работника | VARCHAR(20) |
NOT NULL |
surname |
Фамилия работника | VARCHAR(20) |
NOT NULL |
middle_name |
Отчество работника | VARCHAR(20) |
Название | Описание | Тип данных | Ограничение |
---|---|---|---|
client_id |
Идентификатор клиента | SERIAL |
PRIMARY KEY |
worker_id |
Идентификатор работника | INTEGER |
FOREIGN KEY |
company |
Название компании клиента | VARCHAR(50) |
UNIQUE |
contact_name |
Имя контактного лица клиента | VARCHAR(65) |
NOT NULL |
contact_phone |
Телефон контактного лица | CHAR(16) |
LIKE '+7(___)___-__-__' |
Название | Описание | Тип данных | Ограничение |
---|---|---|---|
client_id |
Идентификатор клиента | INTEGER |
FOREIGN KEY |
address |
Адрес клиента | VARCHAR(200) |
NOT NULL |
from_date |
Дата начала действия адреса | TIMESTAMP |
DEFAULT NOW() |
to_date |
Дата окончания действия адреса | TIMESTAMP |
DEFAULT '5999-01-01 00:00:00' |
Название | Описание | Тип данных | Ограничение |
---|---|---|---|
order_id |
Идентификатор заказа | SERIAL |
PRIMARY KEY |
client_id |
Идентификатор клиента | INTEGER |
FOREIGN KEY |
description |
Описание заказа | TEXT |
|
delivery |
Доставка | BOOLEAN |
NOT NULL |
order_date |
Дата заказа | TIMESTAMP |
DEFAULT NOW() |
Название | Описание | Тип данных | Ограничение |
---|---|---|---|
status_id |
Идентификатор статуса | SERIAL |
PRIMARY KEY |
name |
Название статуса | VARCHAR(15) |
NOT NULL |
Название | Описание | Тип данных | Ограничение |
---|---|---|---|
order_status_id |
Идентификатор статуса заказа | SERIAL |
PRIMARY KEY |
worker_id |
Идентификатор работника | INTEGER |
FOREIGN KEY |
order_id |
Идентификатор заказа | INTEGER |
FOREIGN KEY |
status_id |
Идентификатор статуса | INTEGER |
FOREIGN KEY |
from_date |
Дата начала статуса | DATE |
DEFAULT CURRENT_DATE |
to_date |
Дата окончания статуса | DATE |
|
comment |
Комментарий | TEXT |
|
step_combination |
Комбинация worker_id , order_id и status_id для уникальности |
UNIQUE |
Название | Описание | Тип данных | Ограничение |
---|---|---|---|
product_id |
Идентификатор продукта | SERIAL |
PRIMARY KEY |
name |
Название продукта | VARCHAR(50) |
NOT NULL |
quality |
Качество продукта | VARCHAR(50) |
|
description |
Описание продукта | TEXT |
|
price |
Цена продукта | NUMERIC(10, 2) |
NOT NULL, price >= 0 |
available |
Количество доступных продуктов | INTEGER |
NOT NULL, available >= 0 |
weight |
Вес продукта | NUMERIC(10, 3) |
NOT NULL, weight >= 0 |
Название | Описание | Тип данных | Ограничение |
---|---|---|---|
order_id |
Идентификатор заказа | INTEGER |
FOREIGN KEY |
product_id |
Идентификатор продукта | INTEGER |
FOREIGN KEY |
count |
Количество заказанных продуктов | INTEGER |
NOT NULL, count > 0 |
order_combination |
Комбинация order_id и product_id для уникальности |
UNIQUE |
Название | Описание | Тип данных |
---|---|---|
client_id |
Идентификатор клиента | INTEGER |
client_name |
Имя физического лица, являющегося клиентом | VARCHAR(65) |
client_phone |
Телефон контактного лица клиента | CHAR(16) |
manager_name |
Полное имя менеджера клиента | TEXT |
current_address |
Текущий адрес клиента или NULL , если адрес не указан |
VARCHAR(200) |
Название | Описание | Тип данных |
---|---|---|
client_id |
Идентификатор клиента | INTEGER |
company |
Название компании клиента | VARCHAR(50) |
client_name |
Имя контактного лица клиента | VARCHAR(65) |
client_phone |
Телефон контактного лица клиента | CHAR(16) |
manager_name |
Полное имя менеджера клиента | TEXT |
current_address |
Текущий адрес клиента или NULL , если адрес не указан |
VARCHAR(200) |
Название | Описание | Тип данных |
---|---|---|
product_id |
Идентификатор продукта | INTEGER |
name |
Название продукта | VARCHAR(50) |
available |
Количество доступных продуктов на складе | INTEGER |
booked |
Количество забронированных продуктов | INTEGER |
free |
Количество доступных незабронированных продуктов | INTEGER |
Название | Описание | Тип данных |
---|---|---|
order_id |
Идентификатор заказа | INTEGER |
client_name |
Имя клиента | VARCHAR |
status |
Название статуса заказа | VARCHAR(15) |
status_date |
Дата установки статуса | DATE |
order_date |
Дата размещения заказа | TIMESTAMP |
Описание: Функция возвращает информацию о доставке заказа, включая общий вес заказа, количество требуемых машин и стоимость доставки.
Параметры:
ord_id
(INTEGER): идентификатор заказаpossible_weight
(NUMERIC(10, 3)): максимальный вес, который может уместиться в одной машинеone_car_cost
(NUMERIC(10, 2)): стоимость доставки одной машины
Возвращаемые значения:
total_weight
(NUMERIC(10, 3)): общий вес заказаrequired_cars
(INTEGER): количество машин для доставкиdelivery_cost
(NUMERIC(10, 2)): стоимость доставки
Описание: Функция вычисляет общую стоимость заказа, включая стоимость продуктов и доставки.
Параметры:
ord_id
(INTEGER): идентификатор заказаpossible_weight
(NUMERIC(10, 3)) DEFAULT NULL: максимальный вес, который может уместиться в одной машине (по умолчанию NULL)one_car_cost
(NUMERIC(10, 2)) DEFAULT NULL: стоимость доставки одной машины (по умолчанию NULL)
Возвращаемые значения:
total_cost
(NUMERIC(10, 2)): общая стоимость заказа
Описание:
Процедура обновляет адрес клиента и добавляет новую запись об адресе в таблицу sutk.addresses
.
Параметры:
cl_id
(INTEGER): идентификатор клиентаnew_address
(VARCHAR(200)): новый адрес клиентаnew_address_date
(DATE) DEFAULT NOW(): дата нового адреса (по умолчанию - текущая дата)
Описание: Процедура удаляет всю информацию о клиенте, включая адреса, статусы заказов, продукты в заказах и сами заказы.
Параметры:
clear_client_id
(INTEGER): идентификатор клиента, информацию о котором необходимо удалить
Описание:
Этот триггер проверяет доступность продуктов на складе перед добавлением или обновлением информации о заказанных продуктах в таблице sutk.ordered_products
. Если количество продуктов в заказе превышает количество доступных на складе, генерируется исключение "Not enough products available".
Описание:
Данный триггер автоматически вычитает доступное количество товаров со склада при изменении статуса заказа на определенные значения (3 или 4). Он обновляет количество доступных продуктов в таблице sutk.products
на основе информации о заказанных продуктах.
Описание:
Этот триггер автоматически удаляет информацию о заказанных продуктах из таблицы sutk.ordered_products
при удалении соответствующего заказа из таблицы sutk.orders
.