From 545d815e3c5fe3df12517ede160586466a279c7f Mon Sep 17 00:00:00 2001 From: Chornoknysh Date: Tue, 9 Sep 2025 21:07:33 +0200 Subject: [PATCH 1/4] solution --- task.sql | 71 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 23 deletions(-) diff --git a/task.sql b/task.sql index cc65344..416870b 100644 --- a/task.sql +++ b/task.sql @@ -1,33 +1,58 @@ --- Create database and tables - +-- 1. Пересоздаємо базу +DROP DATABASE IF EXISTS ShopDB; CREATE DATABASE ShopDB; USE ShopDB; +-- 2. Нормалізована структура + +-- 2.1 Країни CREATE TABLE Countries ( - ID INT, + ID INT PRIMARY KEY, + Name VARCHAR(50) +); + +-- 2.2 Продукти +CREATE TABLE Products ( + ID INT PRIMARY KEY, + Name VARCHAR(50) +); + +-- 2.3 Склади +CREATE TABLE Warehouses ( + ID INT PRIMARY KEY, Name VARCHAR(50), - PRIMARY KEY (ID) + Address VARCHAR(100), + CountryID INT, + FOREIGN KEY (CountryID) REFERENCES Countries(ID) ); -CREATE TABLE ProductInventory ( - ID INT, - ProductName VARCHAR(50), +-- 2.4 Інвентар: кількість продуктів на кожному складі +CREATE TABLE Inventory ( + ProductID INT, + WarehouseID INT, WarehouseAmount INT, - WarehouseName VARCHAR(50), - WarehouseAddress VARCHAR(50), - CountryID INT, - FOREIGN KEY (CountryID) REFERENCES Countries(ID) ON DELETE NO ACTION, - PRIMARY KEY (ID) + PRIMARY KEY (ProductID, WarehouseID), + FOREIGN KEY (ProductID) REFERENCES Products(ID), + FOREIGN KEY (WarehouseID) REFERENCES Warehouses(ID) ); --- Populate test data - -INSERT INTO Countries (ID,Name) - VALUES (1, 'Country1'); -INSERT INTO Countries (ID,Name) - VALUES (2, 'Country2'); - -INSERT INTO ProductInventory (ID,ProductName,WarehouseAmount,WarehouseName,WarehouseAddress,CountryID) - VALUES (1, 'AwersomeProduct', 2, 'Warehouse-1', 'City-1, Street-1',1); -INSERT INTO ProductInventory (ID,ProductName,WarehouseAmount,WarehouseName,WarehouseAddress,CountryID) - VALUES (2, 'AwersomeProduct', 5, 'Warehouse-2', 'City-2, Street-2',2); +-- 3. Заповнення тестових даних + +-- 3.1 Країни (як в оригіналі) +INSERT INTO Countries (ID, Name) VALUES + (1, 'Country1'), + (2, 'Country2'); + +-- 3.2 Продукт (AwersomeProduct) +INSERT INTO Products (ID, Name) VALUES + (1, 'AwersomeProduct'); + +-- 3.3 Склады +INSERT INTO Warehouses (ID, Name, Address, CountryID) VALUES + (1, 'Warehouse-1', 'City-1, Street-1', 1), + (2, 'Warehouse-2', 'City-2, Street-2', 2); + +-- 3.4 Інвентар +INSERT INTO Inventory (ProductID, WarehouseID, WarehouseAmount) VALUES + (1, 1, 2), + (1, 2, 5); From 98fbd0eb980435e9f473c962f6123e602632a2a9 Mon Sep 17 00:00:00 2001 From: Chornoknysh Date: Tue, 9 Sep 2025 21:13:34 +0200 Subject: [PATCH 2/4] solution --- task.sql | 51 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/task.sql b/task.sql index 416870b..c2ecf96 100644 --- a/task.sql +++ b/task.sql @@ -1,32 +1,30 @@ --- 1. Пересоздаємо базу +-- 🔄 Пересоздаємо базу DROP DATABASE IF EXISTS ShopDB; CREATE DATABASE ShopDB; USE ShopDB; --- 2. Нормалізована структура - --- 2.1 Країни +-- 🌍 Таблиця країн CREATE TABLE Countries ( ID INT PRIMARY KEY, Name VARCHAR(50) ); --- 2.2 Продукти +-- 📦 Таблиця продуктів CREATE TABLE Products ( ID INT PRIMARY KEY, Name VARCHAR(50) ); --- 2.3 Склади +-- 🏬 Таблиця складів CREATE TABLE Warehouses ( ID INT PRIMARY KEY, Name VARCHAR(50), Address VARCHAR(100), CountryID INT, - FOREIGN KEY (CountryID) REFERENCES Countries(ID) + FOREIGN KEY (CountryID) REFERENCES Countries(ID) ON DELETE NO ACTION ); --- 2.4 Інвентар: кількість продуктів на кожному складі +-- 📊 Таблиця інвентаря (кількість товарів на складах) CREATE TABLE Inventory ( ProductID INT, WarehouseID INT, @@ -36,23 +34,36 @@ CREATE TABLE Inventory ( FOREIGN KEY (WarehouseID) REFERENCES Warehouses(ID) ); --- 3. Заповнення тестових даних +-- 🧪 Тестові дані --- 3.1 Країни (як в оригіналі) +-- Країни INSERT INTO Countries (ID, Name) VALUES - (1, 'Country1'), - (2, 'Country2'); + (1, 'Country1'), + (2, 'Country2'); --- 3.2 Продукт (AwersomeProduct) +-- Продукт INSERT INTO Products (ID, Name) VALUES - (1, 'AwersomeProduct'); + (1, 'AwersomeProduct'); --- 3.3 Склады +-- Склади INSERT INTO Warehouses (ID, Name, Address, CountryID) VALUES - (1, 'Warehouse-1', 'City-1, Street-1', 1), - (2, 'Warehouse-2', 'City-2, Street-2', 2); + (1, 'Warehouse-1', 'City-1, Street-1', 1), + (2, 'Warehouse-2', 'City-2, Street-2', 2); --- 3.4 Інвентар +-- Інвентар INSERT INTO Inventory (ProductID, WarehouseID, WarehouseAmount) VALUES - (1, 1, 2), - (1, 2, 5); + (1, 1, 2), + (1, 2, 5); + +-- 👁️ Створюємо VIEW для сумісності з test.sql (імітація старої ProductInventory) +CREATE VIEW ProductInventory AS +SELECT + ROW_NUMBER() OVER () AS ID, + p.Name AS ProductName, + i.WarehouseAmount, + w.Name AS WarehouseName, + w.Address AS WarehouseAddress, + w.CountryID +FROM Inventory i +JOIN Products p ON i.ProductID = p.ID +JOIN Warehouses w ON i.WarehouseID = w.ID; From aac4d7c8b0edb007a949f505cfe242d359f78337 Mon Sep 17 00:00:00 2001 From: Chornoknysh Date: Tue, 9 Sep 2025 21:16:26 +0200 Subject: [PATCH 3/4] solution --- task.sql | 106 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 61 insertions(+), 45 deletions(-) diff --git a/task.sql b/task.sql index c2ecf96..adf0365 100644 --- a/task.sql +++ b/task.sql @@ -1,69 +1,85 @@ --- 🔄 Пересоздаємо базу +-- 1. Пересоздаємо базу DROP DATABASE IF EXISTS ShopDB; CREATE DATABASE ShopDB; USE ShopDB; --- 🌍 Таблиця країн +-- 2. Таблиці з ENGINE=InnoDB, NOT NULL/UNIQUE та UNSIGNED для кількості + +-- 2.1 Країни CREATE TABLE Countries ( - ID INT PRIMARY KEY, - Name VARCHAR(50) -); + ID INT NOT NULL AUTO_INCREMENT, + Name VARCHAR(50) NOT NULL UNIQUE, + PRIMARY KEY (ID) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; --- 📦 Таблиця продуктів +-- 2.2 Продукти CREATE TABLE Products ( - ID INT PRIMARY KEY, - Name VARCHAR(50) -); + ID INT NOT NULL AUTO_INCREMENT, + Name VARCHAR(50) NOT NULL UNIQUE, + PRIMARY KEY (ID) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; --- 🏬 Таблиця складів +-- 2.3 Склади CREATE TABLE Warehouses ( - ID INT PRIMARY KEY, - Name VARCHAR(50), - Address VARCHAR(100), - CountryID INT, - FOREIGN KEY (CountryID) REFERENCES Countries(ID) ON DELETE NO ACTION -); + ID INT NOT NULL AUTO_INCREMENT, + Name VARCHAR(50) NOT NULL, + Address VARCHAR(100) NOT NULL, + CountryID INT NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT fk_warehouses_country + FOREIGN KEY (CountryID) REFERENCES Countries(ID) + ON DELETE RESTRICT + ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; --- 📊 Таблиця інвентаря (кількість товарів на складах) +-- 2.4 Інвентар CREATE TABLE Inventory ( - ProductID INT, - WarehouseID INT, - WarehouseAmount INT, - PRIMARY KEY (ProductID, WarehouseID), - FOREIGN KEY (ProductID) REFERENCES Products(ID), + ProductID INT NOT NULL, + WarehouseID INT NOT NULL, + WarehouseAmount INT UNSIGNED NOT NULL, + PRIMARY KEY (ProductID, WarehouseID), + CONSTRAINT fk_inventory_product + FOREIGN KEY (ProductID) REFERENCES Products(ID) + ON DELETE RESTRICT + ON UPDATE CASCADE, + CONSTRAINT fk_inventory_warehouse FOREIGN KEY (WarehouseID) REFERENCES Warehouses(ID) -); + ON DELETE RESTRICT + ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; --- 🧪 Тестові дані +-- 3. Тестові дані --- Країни INSERT INTO Countries (ID, Name) VALUES - (1, 'Country1'), - (2, 'Country2'); + (1, 'Country1'), + (2, 'Country2'); --- Продукт INSERT INTO Products (ID, Name) VALUES - (1, 'AwersomeProduct'); + (1, 'AwersomeProduct'); --- Склади INSERT INTO Warehouses (ID, Name, Address, CountryID) VALUES - (1, 'Warehouse-1', 'City-1, Street-1', 1), - (2, 'Warehouse-2', 'City-2, Street-2', 2); + (1, 'Warehouse-1', 'City-1, Street-1', 1), + (2, 'Warehouse-2', 'City-2, Street-2', 2); --- Інвентар INSERT INTO Inventory (ProductID, WarehouseID, WarehouseAmount) VALUES - (1, 1, 2), - (1, 2, 5); + (1, 1, 2), + (1, 2, 5); --- 👁️ Створюємо VIEW для сумісності з test.sql (імітація старої ProductInventory) +-- 4. VIEW для сумісності зі старим тестовим скриптом CREATE VIEW ProductInventory AS SELECT - ROW_NUMBER() OVER () AS ID, - p.Name AS ProductName, - i.WarehouseAmount, - w.Name AS WarehouseName, - w.Address AS WarehouseAddress, - w.CountryID -FROM Inventory i -JOIN Products p ON i.ProductID = p.ID -JOIN Warehouses w ON i.WarehouseID = w.ID; + (@rownum := @rownum + 1) AS ID, + p.Name AS ProductName, + i.WarehouseAmount, + w.Name AS WarehouseName, + w.Address AS WarehouseAddress, + w.CountryID +FROM (SELECT @rownum := 0) AS init +JOIN Inventory i + ON TRUE +JOIN Products p + ON i.ProductID = p.ID +JOIN Warehouses w + ON i.WarehouseID = w.ID +ORDER BY i.ProductID, i.WarehouseID; + From 998d15690861b24facf10088065a302048dfb910 Mon Sep 17 00:00:00 2001 From: Chornoknysh Date: Tue, 9 Sep 2025 21:23:32 +0200 Subject: [PATCH 4/4] solution --- task.sql | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/task.sql b/task.sql index adf0365..2a00288 100644 --- a/task.sql +++ b/task.sql @@ -1,25 +1,25 @@ --- 1. Пересоздаємо базу -DROP DATABASE IF EXISTS ShopDB; +-- 1. Пересоздаємо базу (строго за чеклістом) +DROP DATABASE ShopDB; CREATE DATABASE ShopDB; USE ShopDB; --- 2. Таблиці з ENGINE=InnoDB, NOT NULL/UNIQUE та UNSIGNED для кількості +-- 2. Нормалізована структура з усіма обмеженнями та InnoDB --- 2.1 Країни +-- 2.1 Countries CREATE TABLE Countries ( ID INT NOT NULL AUTO_INCREMENT, Name VARCHAR(50) NOT NULL UNIQUE, PRIMARY KEY (ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; --- 2.2 Продукти +-- 2.2 Products CREATE TABLE Products ( ID INT NOT NULL AUTO_INCREMENT, - Name VARCHAR(50) NOT NULL UNIQUE, + ProductName VARCHAR(50) NOT NULL UNIQUE, PRIMARY KEY (ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; --- 2.3 Склади +-- 2.3 Warehouses CREATE TABLE Warehouses ( ID INT NOT NULL AUTO_INCREMENT, Name VARCHAR(50) NOT NULL, @@ -32,11 +32,11 @@ CREATE TABLE Warehouses ( ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; --- 2.4 Інвентар +-- 2.4 Inventory CREATE TABLE Inventory ( ProductID INT NOT NULL, WarehouseID INT NOT NULL, - WarehouseAmount INT UNSIGNED NOT NULL, + Quantity INT UNSIGNED NOT NULL, PRIMARY KEY (ProductID, WarehouseID), CONSTRAINT fk_inventory_product FOREIGN KEY (ProductID) REFERENCES Products(ID) @@ -54,25 +54,25 @@ INSERT INTO Countries (ID, Name) VALUES (1, 'Country1'), (2, 'Country2'); -INSERT INTO Products (ID, Name) VALUES +INSERT INTO Products (ID, ProductName) VALUES (1, 'AwersomeProduct'); INSERT INTO Warehouses (ID, Name, Address, CountryID) VALUES (1, 'Warehouse-1', 'City-1, Street-1', 1), (2, 'Warehouse-2', 'City-2, Street-2', 2); -INSERT INTO Inventory (ProductID, WarehouseID, WarehouseAmount) VALUES +INSERT INTO Inventory (ProductID, WarehouseID, Quantity) VALUES (1, 1, 2), (1, 2, 5); --- 4. VIEW для сумісності зі старим тестовим скриптом +-- 4. VIEW ProductInventory для сумісності з тестовим скриптом CREATE VIEW ProductInventory AS SELECT (@rownum := @rownum + 1) AS ID, - p.Name AS ProductName, - i.WarehouseAmount, - w.Name AS WarehouseName, - w.Address AS WarehouseAddress, + p.ProductName AS ProductName, + i.Quantity AS WarehouseAmount, + w.Name AS WarehouseName, + w.Address AS WarehouseAddress, w.CountryID FROM (SELECT @rownum := 0) AS init JOIN Inventory i @@ -82,4 +82,3 @@ JOIN Products p JOIN Warehouses w ON i.WarehouseID = w.ID ORDER BY i.ProductID, i.WarehouseID; -