yaraleo / OTUS_RDB

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

OTUS_RDB курсовой проект

Постановка задачи

  1. Интернет магазин (витрина) - иерархическая структура категорий товаров, товары, производители, поставщики, цены, характеристики товаров (у разных категорий товаров - разные характеристики).

2*). расширяем магазин - клиенты, покупки (транзакции);

3*). интеграция магазина с платежными системами - платежные системы, транзакции с платежной системой, аккаунты, счета, транзакции магазина;

Описанные сущности не являются полным и конечным ТЗ (как это и бывает в жизни). Вы как архитектор должны предусмотреть необходимые атрибуты и дополнительные сущности по необходимости. И четко представлять бизнес-задачу которую будет решать эта структура данных.

 Домашнее задание 1

Делаем декомпозицию и нормализацию. В качестве сделанной ДЗ принимается pdf с начальной и конечной моделью.

Решая данное ДЗ вы тренируете навык проектирования БД, выделения сущностей и их атрибутов, построения связей, нормализации данных

Решение

В качестве модели была принята поставка единичного оборудования (например бытовой техники, запчастей, единиц оружия). Производство продукции не привязано к производителю, но каждый единичный товар имеет сериальный номер.

Image of Yaktocat

Таблицы отношений:

Таблица Назначение
vendors производители оборудования
dealers поставщики оборудования
dealers2vendors связь поставщики - производители
description характеристики с описаниями
stock товары на складе
categories категории товаров
product карточка товара (интернет магазина)
product2description связь товаров с их характеристиками
orders заказы
order2product связь заказы - товары
payments платежи
users пользователи

 Домашнее задание 2

Корректируем типы данных в модели при необходимости Взять свою структуру данных из ДЗ-1 и прописать комментарии на каждое поле с пояснением почему выбран данный тип поля и на сколько он удовлетворяет поставленной задаче

Решение

Table: VENDORS -
Attributes
Name Type Not Null PK FK Default Comment
id_vendorINT(11)YesYesNoИдентификатор производителя в таблице
vend_nameVARCHAR(125)YesNoNoНазвание производителя
vend_addressVARCHAR(255)YesNoNoАдрес производителя

Index: PRIMARY
Attributes
Name Columns Type Description
PRIMARY['`id_vendor`']PRIMARYИндекс на ключевое поле

Index: id_vendor_idx
Attributes
Name Columns Type Description
id_vendor_idx['`id_vendor`']UNIQUEИндекс на внешний ключ


Table: categories -
Attributes
Name Type Not Null PK FK Default Comment
id_categINT(11)YesYesYesИдентификатор категории товара, первичный ключ. Тип INT самый подходящий.
name_categVARCHAR(45)YesNoNoИмя категории. Взят универсальный формат для текста. Длина произвольная.
perent_id_categINT(11)NoNoYesВнешний ключ ссылается на какое-либо занчение из этой же таблицы, которое является родительским в иерархии категорий.

Index: PRIMARY
Attributes
Name Columns Type Description
PRIMARY['`id_categ`']PRIMARYИндекс на ключевое поле

Index: parent_id_categ_idx
Attributes
Name Columns Type Description
parent_id_categ_idx['`id_categ`', '`perent_id_categ`']INDEXИндекс на внешний ключ


Table: dealers -
Attributes
Name Type Not Null PK FK Default Comment
id_dealerINT(11)YesYesNoИдентификатор поставщика в таблице
dealer_nameVARCHAR(45)YesNoNoИмя поставщика
dealer_adressVARCHAR(255)YesNoNoАдрес поставщика

Index: PRIMARY
Attributes
Name Columns Type Description
PRIMARY['`id_dealer`']PRIMARYИндекс на ключевое поле

Index: id_dealer_idx
Attributes
Name Columns Type Description
id_dealer_idx['`id_dealer`']INDEXИндекс на внешний ключ


Table: product -
Attributes
Name Type Not Null PK FK Default Comment
id_productINT(11)YesYesNoИдентификатор продукта в таблице
id_categINT(11)NoNoYesИдентификатор категории
product_nameVARCHAR(45)NoNoNoИмя продукта
priceDECIMAL(10,4)NoNoNoЦена продажи

Index: PRIMARY
Attributes
Name Columns Type Description
PRIMARY['`id_product`']PRIMARYИндекс на ключевое поле

Index: id_categ_idx
Attributes
Name Columns Type Description
id_categ_idx['`id_categ`']INDEXИндекс на внешний ключ


Table: dealers2vendors -
Attributes
Name Type Not Null PK FK Default Comment
id_dealerINT(11)YesYesYesИдентификатор поставщика
id_vendorINT(11)YesYesYesИдентификатор производителя
data_startDATETIMENoNoNoДата начала отношений Дилер-Вендор
data_endDATETIMENoNoNoДата завершения отношений Дилер-Вендор

Index: id_dealer_idx
Attributes
Name Columns Type Description
id_dealer_idx['`id_dealer`']INDEXИндекс на внешний ключ

Index: id_vendor_idx
Attributes
Name Columns Type Description
id_vendor_idx['`id_vendor`']INDEXИндекс на внешний ключ

Index: PRIMARY
Attributes
Name Columns Type Description
PRIMARY['`id_vendor`', '`id_dealer`']PRIMARY


Table: stock -
Attributes
Name Type Not Null PK FK Default Comment
id_stockINT(11)YesYesNoИдентификатор записи в таблице
id_dateDATEYesNoNoСтатус единицы товара на складе
id_dealerINT(11)NoNoYes
id_vendorINT(11)YesNoYesВнешний ключ модель
item_serial_numVARCHAR(45)NoNoNoСериальный уникальный номер единцы товара
item_costDECIMAL(10,4)YesNoNoЗакупочная цена поставщика
id_categINT(11)NoNoYesИдентфикатор категории - Внешний ключ
reserve_soldENUM('1', '2', '3', '4')NoNoNoСтатус 1-резерв, 2- продано, 3 - неисправно, 4 - выставочный образец
id_productINT(11)NoNoYes

Index: PRIMARY
Attributes
Name Columns Type Description
PRIMARY['`id_stock`']PRIMARYИндекс на ключевое поле

Index: id_categ_idx
Attributes
Name Columns Type Description
id_categ_idx['`id_categ`']INDEXИндекс на внешний ключ

Index: id_product_idx
Attributes
Name Columns Type Description
id_product_idx['`id_product`']INDEX

Index: id_dealer_idx
Attributes
Name Columns Type Description
id_dealer_idx['`id_dealer`']INDEX

Index: id_vendor_idx
Attributes
Name Columns Type Description
id_vendor_idx['`id_vendor`']INDEX


Table: product2description -
Attributes
Name Type Not Null PK FK Default Comment
id_descriptionINT(11)YesYesYesИдентификатор характеристики
id_productINT(11)YesYesYesИдентификатор продукта

Index: PRIMARY
Attributes
Name Columns Type Description
PRIMARY['`id_description`', '`id_product`']PRIMARY

Index: id_product_idx
Attributes
Name Columns Type Description
id_product_idx['`id_product`']INDEX


Table: description -
Attributes
Name Type Not Null PK FK Default Comment
id_descriptionINT(11)YesYesNoИдентификатор характеристики в таблице
description_nameVARCHAR(45)YesNoNoНазвание характеристики
description_volVARCHAR(255)NoNoNoЗначение или описание характеристики

Index: PRIMARY
Attributes
Name Columns Type Description
PRIMARY['`id_description`']PRIMARYИндекс на ключевое поле

Index: id_description_idx
Attributes
Name Columns Type Description
id_description_idx['`id_description`']INDEX


Table: users -
Attributes
Name Type Not Null PK FK Default Comment
id_userINT(11)YesYesNoИдентификация пользователя (покупателя)
nameVARCHAR(45)YesNoNoИмя пользователя
lastnameVARCHAR(45)YesNoNoФамилия пользователя
birthdateDATEYesNoNoДата рождения пользователя
loginVARCHAR(45)YesNoNoЛогин для входа на сайт
hash_passVARCHAR(45)YesNoNoХэш пароля

Index: PRIMARY
Attributes
Name Columns Type Description
PRIMARY['`id_user`']PRIMARYИндекс на ключевое поле


Table: orders -
Attributes
Name Type Not Null PK FK Default Comment
id_orderINT(11)YesYesNoИдентификатор заказа в таблице
order_numberVARCHAR(45)YesNoNoНомер заказа в бухгалтерской системе компании
dateDATEYesNoNoДата заказа
id_userINT(11)YesNoYesИдентификатор покупателя

Index: PRIMARY
Attributes
Name Columns Type Description
PRIMARY['`id_order`']PRIMARYИндекс на ключевое поле

Index: order_user_idx
Attributes
Name Columns Type Description
order_user_idx['`id_user`']INDEXИндекс на внешний ключ


Table: order2product -
Attributes
Name Type Not Null PK FK Default Comment
id_orderINT(11)YesYesYesИдентификатор заказа в таблице
id_productINT(11)YesYesYesИдентификатор продукта
qtyINT(11)YesNoNoКоличество единиц продукта

Index: id_product_idx
Attributes
Name Columns Type Description
id_product_idx['`id_product`']INDEXИндекс на внешний ключ

Index: id_order_idx
Attributes
Name Columns Type Description
id_order_idx['`id_order`']INDEXИндекс на внешний ключ

Index: PRIMARY
Attributes
Name Columns Type Description
PRIMARY['`id_order`', '`id_product`']PRIMARY


Table: payments -
Attributes
Name Type Not Null PK FK Default Comment
id_paymentsINT(11)YesYesNoИдентификатор платежа в таблице
transaction_idINT(21)YesNoNoИдентификатор транзакции в платежной системе
datetimeDATETIMEYesNoNoДата время транзакции
id_orderINT(11)YesNoYesИдентификатор заказа
sumINT(11)YesNoNoСумма платежа
currencyVARCHAR(25)YesNoNoВалюта платежа

Index: PRIMARY
Attributes
Name Columns Type Description
PRIMARY['`id_payments`']PRIMARYИндекс на ключевое поле

Index: id_order_idx
Attributes
Name Columns Type Description
id_order_idx['`id_order`']INDEXИндекс на внешний ключ


 Домашнее задание 3

Описываем логику транзакций для своей модели данных В вашем проекте базы данных опишите транзакцию, которая будет включать в себя несколько действий и исключать возможность взаимных блокировок и неоднозначных ситуаций

Описание должно включать в себя

  • бизнес задачу
  • вероятные проблемы
  • SQL транзакции или возможно нескольких транзакций

Решение

Бизнес-задача 1. Перемещение товара в корзину электронного магазина.

Помещаем выбранный товар в корзину, и одновременно резервируем единицу товара на складе, если товара не хватает, то откатываем.

START TRANSACTION;
INSERT INTO orders (order_number, date, id_user) VALUES();
INSERT INTO order2product (id_order, id_product, qty) VALUES();
UPDATE stock SET reserve_sold="1" WHERE id_item=id_model;
COMMIT;

Бизнес-задача 2. Оплата товара.

Платим за товар и одновременно ожидаем подтверждения об оплате от платежной системы, ждем подтверждения определенное время. Если приходит положительный ответ, то все нормально, если отрицательный или превышен тайм-аут, то откатываем.

START TRANSACTION;
INSERT INTO payments (datime, id_order, sum, currency) VALUES();
--Если приходит положительный ответ, то все нормально, если отрицательный или превышен тайм-аут, то откатываем. 
COMMIT;

Бизнес-задача 3. Проверка цены продажи и закупочной цены.

Получаем товар на склад по закупочной цене N и одноверменно проверяем по какой цене мы продаем товар, чтобы не поставить цену себе убыток.

START TRANSACTION;
--Получаем товар на склад по закупочной цене N и одноверменно проверяем по какой цене мы продаем товар, чтобы не поставить цену себе убыток. 
COMMIT;

Бизнес-задача 4. Массовая процедура вставки в таблицу товары (stocks).

Последовательно делаем вставки новых товаров в таблицу stock. Мы хотим чтобы эта операция выполнилась одним действием.

START TRANSACTION;
INSERT INTO stock (id_dealer2vendor, id_date, id_model, item_serial_num, item_cost) VALUES();
INSERT INTO stock (id_dealer2vendor, id_date, id_model, item_serial_num, item_cost) VALUES();
INSERT INTO stock (id_dealer2vendor, id_date, id_model, item_serial_num, item_cost) VALUES();
INSERT INTO stock (id_dealer2vendor, id_date, id_model, item_serial_num, item_cost) VALUES();
...
COMMIT;

Домашнее задание 4

Добавляем в модель данных дополнительные индексы и ограничения

1. Проводим анализ возможных запросов\отчетов\поиска данных.

2. Предполагаем возможную кардинальность поля.

3. Создаем дополнительные индексы - простые или композитные.

4. На каждый индекс пишем краткое описание зачем он нужен (почему по этому полю\полям).

5. Думаем какие логические ограничения в БД нужно добавить - например какие поля должны быть уникальны, в какие нужно добавить условия, чтобы не нарушить бизнес логику. Пример - нельзя провести операцию по переводу средств на отрицательную сумму.

6. Создаем ограничения по выбранным полям.

Решение

Домашнее задание 5

Доработка проекта

С учетом всех пройденных занятий доработать свой проект до финального представления

В проекте должны быть:

- схема

- документация

- примеры бизнес-задач которые решает база

- рекомендации к использованию репликации

- рекомендации к резервному копированию

Решение

Домашнее задание 6

Создаем базу из проектной модели

В рамках этого домашнего задания вы сможете писать скрипт создания БД и разворачивать свой дев проект в докере

Создаем Dockerfile

в котором разворачивается image нужной СУБД

и скриптом разворачивается структура вашего проекта

наружу должен быть прокинут порт для подключения

формат сдачи - github репозиторий

в README должно быть описано как подключится к вашей базе (субд, название базы, логин, пароль, порт)

** для учебной базы сделать скрипт для партиционирования таблицы CDR по месяцам (на выходе SQL скрипт на модерацию + дамп измененной структуры)

*** проанализировать базу voip и создать внешние ключи (скрипт для создания ключей + схема данных)*

Решение

Домашнее задание 7

Создаем скрипты очистки и первичного заполнения базы

Наполняем свою базу данными!!

1. Запросы на встравку данных INSERT VALUES

2. Запросы на insert с использованием Select

3. Изменение данных UPDATE, UPDATE с использованием JOIN

4. Delete

*5. Процедура со вставкой и обновлением блока *

6. Merge – потренироваться и прочувствовать

формат сдачи - расширяем докерфайл - который при старте поднимает базу с данными

Решение

Домашнее задание 8

SQL выборка

Рассчитываем стоимость звонка в БД voip

*Строим Select для выборки всех звонков *

*поля для связи *

CDR.src_ip -> oper_ip.IP_OP

oper_ip.OP_ID -> SITE.ID

SITE.rate_o -> RATES.RATE_ID

RATES.DEST_ID -> DEST_CODES.CODE_ID

RATES.price - цена

*DEST_CODES.CODE. - код направления *

необходимо учитывать дату звонка, дату действия тарифа и дату действия IP оператора

*В oper_ip также могут быть дублирующие IP. в том числе и по дате (есть условия по префиксу номера и ip ceрвера) - *

для облегчения задачи можно вытащить уникальные записи в отдельную таблицу oper_ip_tmp

** сделать выборку с учетом префикса номера в oper_ip*

Критерии оценки: 4 - студент старался, SQL пишет но корректный запрос построить не удалось

5 - все сделано

*6 - выполнено задание со **

Решение

About


Languages

Language:TSQL 100.0%