From 09539c331ba1d4963790e9d5538bce1de0f42e81 Mon Sep 17 00:00:00 2001 From: Yurii Keniu Date: Sat, 20 Sep 2025 15:10:33 +0200 Subject: [PATCH 1/5] normalization: normalized --- task.sql | 87 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 63 insertions(+), 24 deletions(-) diff --git a/task.sql b/task.sql index cc65344..6ae5ca6 100644 --- a/task.sql +++ b/task.sql @@ -1,33 +1,72 @@ --- Create database and tables - +DROP DATABASE IF EXISTS ShopDB; CREATE DATABASE ShopDB; USE ShopDB; +CREATE TABLE Streets( + ID INT AUTO_INCREMENT, + Name VARCHAR(50) NOT NULL, + PRIMARY KEY (ID) +); + +CREATE TABLE Cities( + ID INT AUTO_INCREMENT, + Name VARCHAR(50) NOT NULL, + StreetID INT, + FOREIGN KEY (StreetID) REFERENCES Streets(ID) ON DELETE SET NULL, + PRIMARY KEY (ID) +); +CREATE INDEX idx_Cities_StreetID ON Cities(StreetID); + CREATE TABLE Countries ( - ID INT, - Name VARCHAR(50), + ID INT AUTO_INCREMENT, + Name VARCHAR(50) NOT NULL, + CityID INT, + FOREIGN KEY (CityID) REFERENCES Cities(ID) ON DELETE SET NULL, PRIMARY KEY (ID) ); +CREATE INDEX idx_Countries_CityID ON Countries(CityID); -CREATE TABLE ProductInventory ( - ID INT, - ProductName VARCHAR(50), - WarehouseAmount INT, - WarehouseName VARCHAR(50), - WarehouseAddress VARCHAR(50), - CountryID INT, - FOREIGN KEY (CountryID) REFERENCES Countries(ID) ON DELETE NO ACTION, - PRIMARY KEY (ID) +CREATE TABLE Products( + ID INT AUTO_INCREMENT, + Name VARCHAR(50) NOT NULL, + PRIMARY KEY (ID) +); + +CREATE TABLE ProductInventory( + ID INT AUTO_INCREMENT, + WarehouseName VARCHAR(50) NOT NULL, + ProductID INT, + FOREIGN KEY (ProductID) REFERENCES Products(ID) ON DELETE SET NULL, + WarehouseAmount INT, + CountryID INT, + FOREIGN KEY (CountryID) REFERENCES Countries(ID) ON DELETE SET NULL, + PRIMARY KEY (ID) ); +CREATE INDEX idx_ProductInventory_ProductID ON ProductInventory(ProductID); +CREATE INDEX idx_ProductInventory_CountryID ON ProductInventory(CountryID); + +INSERT INTO Streets (Name) VALUES ('Street-1'); +SET @Street1ID = LAST_INSERT_ID(); +INSERT INTO Streets (Name) VALUES ('Street-2'); +SET @Street2ID = LAST_INSERT_ID(); +INSERT INTO Cities (Name, StreetID) + VALUES ('City-1', @Street1ID); +SET @City1ID = LAST_INSERT_ID(); +INSERT INTO Cities (Name, StreetID) + VALUES ('City-2', @Street2ID); +SET @City2ID = LAST_INSERT_ID(); +INSERT INTO Countries (Name, CityID) + VALUES ('Country1', @City1ID); +SET @Country1ID = LAST_INSERT_ID(); +INSERT INTO Countries (Name, CityID) + VALUES ('Country2', @City2ID); +SET @Country2ID = LAST_INSERT_ID(); + +INSERT INTO Products (Name) + VALUES ('AwesomeProduct'); +SET @Product1ID = LAST_INSERT_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); +INSERT INTO ProductInventory (WarehouseName, ProductID, WarehouseAmount, CountryID) +VALUES +('Warehouse-1', @Product1ID, 2, @Country1ID), +('Warehouse-2', @Product1ID, 5, @Country2ID); From da690ab02bab5517d05d58af8f49a7b223b941a2 Mon Sep 17 00:00:00 2001 From: Yurii Keniu Date: Sat, 20 Sep 2025 15:42:55 +0200 Subject: [PATCH 2/5] normalization: added warehouses, changed address --- task.sql | 82 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 36 deletions(-) diff --git a/task.sql b/task.sql index 6ae5ca6..bb33813 100644 --- a/task.sql +++ b/task.sql @@ -2,71 +2,81 @@ DROP DATABASE IF EXISTS ShopDB; CREATE DATABASE ShopDB; USE ShopDB; -CREATE TABLE Streets( +CREATE TABLE Countries ( + ID INT AUTO_INCREMENT, + Name VARCHAR(50) NOT NULL, + PRIMARY KEY (ID) +); + +CREATE TABLE Cities( ID INT AUTO_INCREMENT, Name VARCHAR(50) NOT NULL, + CountryID INT, + FOREIGN KEY (CountryID) REFERENCES Countries(ID) ON DELETE SET NULL, PRIMARY KEY (ID) ); +CREATE INDEX idx_Cities_CountryID ON Cities(CountryID); -CREATE TABLE Cities( + +CREATE TABLE Streets( ID INT AUTO_INCREMENT, Name VARCHAR(50) NOT NULL, - StreetID INT, - FOREIGN KEY (StreetID) REFERENCES Streets(ID) ON DELETE SET NULL, + CityID INT, + FOREIGN KEY (CityID) REFERENCES Cities(ID) ON DELETE SET NULL, PRIMARY KEY (ID) ); -CREATE INDEX idx_Cities_StreetID ON Cities(StreetID); +CREATE INDEX idx_Streets_CityID ON Streets(CityID); -CREATE TABLE Countries ( - ID INT AUTO_INCREMENT, - Name VARCHAR(50) NOT NULL, - CityID INT, - FOREIGN KEY (CityID) REFERENCES Cities(ID) ON DELETE SET NULL, - PRIMARY KEY (ID) +CREATE TABLE Products( + ID INT AUTO_INCREMENT, + Name VARCHAR(50) NOT NULL, + PRIMARY KEY (ID) ); -CREATE INDEX idx_Countries_CityID ON Countries(CityID); -CREATE TABLE Products( +CREATE TABLE Warehouses( ID INT AUTO_INCREMENT, Name VARCHAR(50) NOT NULL, + CountryID INT, + FOREIGN KEY (CountryID) REFERENCES Countries(ID) ON DELETE SET NULL, PRIMARY KEY (ID) ); +CREATE INDEX idx_Warehouses_CountryID ON Warehouses(CountryID); CREATE TABLE ProductInventory( ID INT AUTO_INCREMENT, - WarehouseName VARCHAR(50) NOT NULL, ProductID INT, FOREIGN KEY (ProductID) REFERENCES Products(ID) ON DELETE SET NULL, WarehouseAmount INT, - CountryID INT, - FOREIGN KEY (CountryID) REFERENCES Countries(ID) ON DELETE SET NULL, + WarehouseID INT, + FOREIGN KEY (WarehouseID) REFERENCES Warehouses(ID) ON DELETE SET NULL, PRIMARY KEY (ID) ); CREATE INDEX idx_ProductInventory_ProductID ON ProductInventory(ProductID); -CREATE INDEX idx_ProductInventory_CountryID ON ProductInventory(CountryID); -INSERT INTO Streets (Name) VALUES ('Street-1'); -SET @Street1ID = LAST_INSERT_ID(); -INSERT INTO Streets (Name) VALUES ('Street-2'); -SET @Street2ID = LAST_INSERT_ID(); -INSERT INTO Cities (Name, StreetID) - VALUES ('City-1', @Street1ID); -SET @City1ID = LAST_INSERT_ID(); -INSERT INTO Cities (Name, StreetID) - VALUES ('City-2', @Street2ID); -SET @City2ID = LAST_INSERT_ID(); -INSERT INTO Countries (Name, CityID) - VALUES ('Country1', @City1ID); +INSERT INTO Countries (Name) VALUES ('Country1'); SET @Country1ID = LAST_INSERT_ID(); -INSERT INTO Countries (Name, CityID) - VALUES ('Country2', @City2ID); +INSERT INTO Countries (Name) VALUES ('Country2'); SET @Country2ID = LAST_INSERT_ID(); -INSERT INTO Products (Name) - VALUES ('AwesomeProduct'); +INSERT INTO Cities (Name, CountryID) VALUES ('City-1', @Country1ID); +SET @City1ID = LAST_INSERT_ID(); +INSERT INTO Cities (Name, CountryID) VALUES ('City-2', @Country2ID); +SET @City2ID = LAST_INSERT_ID(); + +INSERT INTO Streets (Name, CityID) VALUES ('Street-1', @City1ID); +SET @Street1ID = LAST_INSERT_ID(); +INSERT INTO Streets (Name, CityID) VALUES ('Street-2', @City2ID); +SET @Street2ID = LAST_INSERT_ID(); + +INSERT INTO Products (Name) VALUES ('AwesomeProduct'); SET @Product1ID = LAST_INSERT_ID(); -INSERT INTO ProductInventory (WarehouseName, ProductID, WarehouseAmount, CountryID) +INSERT INTO Warehouses (Name, CountryID) VALUES ('Warehouse-1', @Country1ID); +SET @Warehouse1ID = LAST_INSERT_ID(); +INSERT INTO Warehouses (Name, CountryID) VALUES ('Warehouse-2', @Country2ID); +SET @Warehouse2ID = LAST_INSERT_ID(); + +INSERT INTO ProductInventory (ProductID, WarehouseAmount, WarehouseID) VALUES -('Warehouse-1', @Product1ID, 2, @Country1ID), -('Warehouse-2', @Product1ID, 5, @Country2ID); +(@Product1ID, 2, @Warehouse1ID), +(@Product1ID, 5, @Warehouse2ID); From 5b5f29fa04bdf9c2f1795c58aa543c54febd3b94 Mon Sep 17 00:00:00 2001 From: Yurii Keniu Date: Sat, 20 Sep 2025 16:13:54 +0200 Subject: [PATCH 3/5] normalization: deleted streets --- task.sql | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/task.sql b/task.sql index bb33813..8c3c2dc 100644 --- a/task.sql +++ b/task.sql @@ -17,16 +17,6 @@ CREATE TABLE Cities( ); CREATE INDEX idx_Cities_CountryID ON Cities(CountryID); - -CREATE TABLE Streets( - ID INT AUTO_INCREMENT, - Name VARCHAR(50) NOT NULL, - CityID INT, - FOREIGN KEY (CityID) REFERENCES Cities(ID) ON DELETE SET NULL, - PRIMARY KEY (ID) -); -CREATE INDEX idx_Streets_CityID ON Streets(CityID); - CREATE TABLE Products( ID INT AUTO_INCREMENT, Name VARCHAR(50) NOT NULL, @@ -36,11 +26,13 @@ CREATE TABLE Products( CREATE TABLE Warehouses( ID INT AUTO_INCREMENT, Name VARCHAR(50) NOT NULL, - CountryID INT, - FOREIGN KEY (CountryID) REFERENCES Countries(ID) ON DELETE SET NULL, + CityID INT, + FOREIGN KEY (CityID) REFERENCES Cities(ID) ON DELETE SET NULL, + WarehouseAddress VARCHAR(50), PRIMARY KEY (ID) ); -CREATE INDEX idx_Warehouses_CountryID ON Warehouses(CountryID); +CREATE INDEX idx_Warehouses_CityID ON Warehouses(CityID); + CREATE TABLE ProductInventory( ID INT AUTO_INCREMENT, @@ -52,6 +44,7 @@ CREATE TABLE ProductInventory( PRIMARY KEY (ID) ); CREATE INDEX idx_ProductInventory_ProductID ON ProductInventory(ProductID); +CREATE INDEX idx_ProductInventory_WarehouseID ON ProductInventory(WarehouseID); INSERT INTO Countries (Name) VALUES ('Country1'); SET @Country1ID = LAST_INSERT_ID(); @@ -63,17 +56,12 @@ SET @City1ID = LAST_INSERT_ID(); INSERT INTO Cities (Name, CountryID) VALUES ('City-2', @Country2ID); SET @City2ID = LAST_INSERT_ID(); -INSERT INTO Streets (Name, CityID) VALUES ('Street-1', @City1ID); -SET @Street1ID = LAST_INSERT_ID(); -INSERT INTO Streets (Name, CityID) VALUES ('Street-2', @City2ID); -SET @Street2ID = LAST_INSERT_ID(); - INSERT INTO Products (Name) VALUES ('AwesomeProduct'); SET @Product1ID = LAST_INSERT_ID(); -INSERT INTO Warehouses (Name, CountryID) VALUES ('Warehouse-1', @Country1ID); +INSERT INTO Warehouses (Name, CityID, WarehouseAddress) VALUES ('Warehouse-1', @City1ID, 'Address-1'); SET @Warehouse1ID = LAST_INSERT_ID(); -INSERT INTO Warehouses (Name, CountryID) VALUES ('Warehouse-2', @Country2ID); +INSERT INTO Warehouses (Name, CityID, WarehouseAddress) VALUES ('Warehouse-2', @City2ID, 'Address-2'); SET @Warehouse2ID = LAST_INSERT_ID(); INSERT INTO ProductInventory (ProductID, WarehouseAmount, WarehouseID) From 346d28080926820c15eec35a8e57ac89783aa56e Mon Sep 17 00:00:00 2001 From: Yurii Keniu Date: Sat, 20 Sep 2025 16:35:35 +0200 Subject: [PATCH 4/5] normalization: deleted city --- task.sql | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/task.sql b/task.sql index 8c3c2dc..8b4bcaf 100644 --- a/task.sql +++ b/task.sql @@ -8,15 +8,6 @@ CREATE TABLE Countries ( PRIMARY KEY (ID) ); -CREATE TABLE Cities( - ID INT AUTO_INCREMENT, - Name VARCHAR(50) NOT NULL, - CountryID INT, - FOREIGN KEY (CountryID) REFERENCES Countries(ID) ON DELETE SET NULL, - PRIMARY KEY (ID) -); -CREATE INDEX idx_Cities_CountryID ON Cities(CountryID); - CREATE TABLE Products( ID INT AUTO_INCREMENT, Name VARCHAR(50) NOT NULL, @@ -26,22 +17,21 @@ CREATE TABLE Products( CREATE TABLE Warehouses( ID INT AUTO_INCREMENT, Name VARCHAR(50) NOT NULL, - CityID INT, - FOREIGN KEY (CityID) REFERENCES Cities(ID) ON DELETE SET NULL, + CountryID INT, + FOREIGN KEY (CountryID) REFERENCES Countries(ID) ON DELETE SET NULL, WarehouseAddress VARCHAR(50), PRIMARY KEY (ID) ); -CREATE INDEX idx_Warehouses_CityID ON Warehouses(CityID); +CREATE INDEX idx_Warehouses_CountryID ON Warehouses(CountryID); CREATE TABLE ProductInventory( - ID INT AUTO_INCREMENT, ProductID INT, - FOREIGN KEY (ProductID) REFERENCES Products(ID) ON DELETE SET NULL, + FOREIGN KEY (ProductID) REFERENCES Products(ID), WarehouseAmount INT, WarehouseID INT, - FOREIGN KEY (WarehouseID) REFERENCES Warehouses(ID) ON DELETE SET NULL, - PRIMARY KEY (ID) + FOREIGN KEY (WarehouseID) REFERENCES Warehouses(ID), + PRIMARY KEY (ProductID, WarehouseID) ); CREATE INDEX idx_ProductInventory_ProductID ON ProductInventory(ProductID); CREATE INDEX idx_ProductInventory_WarehouseID ON ProductInventory(WarehouseID); @@ -51,17 +41,12 @@ SET @Country1ID = LAST_INSERT_ID(); INSERT INTO Countries (Name) VALUES ('Country2'); SET @Country2ID = LAST_INSERT_ID(); -INSERT INTO Cities (Name, CountryID) VALUES ('City-1', @Country1ID); -SET @City1ID = LAST_INSERT_ID(); -INSERT INTO Cities (Name, CountryID) VALUES ('City-2', @Country2ID); -SET @City2ID = LAST_INSERT_ID(); - INSERT INTO Products (Name) VALUES ('AwesomeProduct'); SET @Product1ID = LAST_INSERT_ID(); -INSERT INTO Warehouses (Name, CityID, WarehouseAddress) VALUES ('Warehouse-1', @City1ID, 'Address-1'); +INSERT INTO Warehouses (Name, CountryID, WarehouseAddress) VALUES ('Warehouse-1', @Country1ID, 'City-1, Street-1'); SET @Warehouse1ID = LAST_INSERT_ID(); -INSERT INTO Warehouses (Name, CityID, WarehouseAddress) VALUES ('Warehouse-2', @City2ID, 'Address-2'); +INSERT INTO Warehouses (Name, CountryID, WarehouseAddress) VALUES ('Warehouse-2', @Country2ID, 'City-2, Street-2'); SET @Warehouse2ID = LAST_INSERT_ID(); INSERT INTO ProductInventory (ProductID, WarehouseAmount, WarehouseID) From 38aeece8de738a500c1aaa8f543c091233aedf83 Mon Sep 17 00:00:00 2001 From: Yurii Keniu Date: Sat, 20 Sep 2025 16:56:27 +0200 Subject: [PATCH 5/5] transaction: added PK --- task.sql | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/task.sql b/task.sql index 8b4bcaf..8aafb16 100644 --- a/task.sql +++ b/task.sql @@ -26,12 +26,13 @@ CREATE INDEX idx_Warehouses_CountryID ON Warehouses(CountryID); CREATE TABLE ProductInventory( + ID INT AUTO_INCREMENT, ProductID INT, - FOREIGN KEY (ProductID) REFERENCES Products(ID), + FOREIGN KEY (ProductID) REFERENCES Products(ID) ON DELETE SET NULL, WarehouseAmount INT, WarehouseID INT, - FOREIGN KEY (WarehouseID) REFERENCES Warehouses(ID), - PRIMARY KEY (ProductID, WarehouseID) + FOREIGN KEY (WarehouseID) REFERENCES Warehouses(ID) ON DELETE SET NULL, + PRIMARY KEY (ID) ); CREATE INDEX idx_ProductInventory_ProductID ON ProductInventory(ProductID); CREATE INDEX idx_ProductInventory_WarehouseID ON ProductInventory(WarehouseID);