diff --git a/task.sql b/task.sql index cc65344..eb5f4bf 100644 --- a/task.sql +++ b/task.sql @@ -1,33 +1,75 @@ --- Create database and tables +-- Database Normalization Task +-- ShopDB - Online Shop Database (3NF Normalized) +-- Drop the database if it exists +DROP DATABASE IF EXISTS ShopDB; + +-- Create the database CREATE DATABASE ShopDB; USE ShopDB; +-- Create Countries table (already in 3NF) CREATE TABLE Countries ( - ID INT, - Name VARCHAR(50), - PRIMARY KEY (ID) + ID INT AUTO_INCREMENT PRIMARY KEY, + Name VARCHAR(255) NOT NULL UNIQUE +); + +-- Create Products table (2NF: separate product information) +CREATE TABLE Products ( + ID INT AUTO_INCREMENT PRIMARY KEY, + ProductName VARCHAR(255) NOT NULL UNIQUE +); + +-- Create Warehouses table (2NF: separate warehouse information) +CREATE TABLE Warehouses ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WarehouseName VARCHAR(255) NOT NULL, + WarehouseAddress VARCHAR(255) NOT NULL, + CountryID INT NOT NULL, + FOREIGN KEY (CountryID) REFERENCES Countries(ID), + UNIQUE KEY unique_warehouse (WarehouseName, WarehouseAddress) ); +-- Create ProductInventory table (3NF: only inventory-specific data) 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) + ID INT AUTO_INCREMENT PRIMARY KEY, + ProductID INT NOT NULL, + WarehouseID INT NOT NULL, + Amount INT NOT NULL DEFAULT 0, + FOREIGN KEY (ProductID) REFERENCES Products(ID), + FOREIGN KEY (WarehouseID) REFERENCES Warehouses(ID), + UNIQUE KEY unique_product_warehouse (ProductID, WarehouseID) ); --- 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 test data into Countries +INSERT INTO Countries (Name) VALUES +('Ukraine'), +('Poland'), +('Germany'), +('USA'); + +-- Insert test data into Products +INSERT INTO Products (ProductName) VALUES +('Laptop Dell XPS 13'), +('iPhone 14 Pro'), +('Samsung Galaxy S23'), +('MacBook Pro 16'), +('iPad Air'), +('Surface Pro 9'); + +-- Insert test data into Warehouses +INSERT INTO Warehouses (WarehouseName, WarehouseAddress, CountryID) VALUES +('Main Warehouse Kyiv', '123 Khreshchatyk St, Kyiv', 1), +('Warehouse Lviv', '456 Svobody Ave, Lviv', 1), +('Warsaw Central', '321 MarszaƂkowska St, Warsaw', 2), +('Berlin Storage', '987 Unter den Linden, Berlin', 3), +('New York Depot', '258 Broadway, New York', 4); + +-- Insert test data into ProductInventory +INSERT INTO ProductInventory (ProductID, WarehouseID, Amount) VALUES +-- Minimal test data - exactly 5 records +(1, 1, 50), -- Laptop Dell XPS 13 in Kyiv +(2, 2, 30), -- iPhone 14 Pro in Lviv +(3, 3, 25), -- Samsung Galaxy S23 in Warsaw +(4, 4, 15), -- MacBook Pro 16 in Berlin +(5, 5, 40); -- iPad Air in New York \ No newline at end of file