Загрузка данных


-- 1. Таблица Пользователей (Администраторы, Менеджеры, Клиенты)
-- По ТЗ: логин, фамилия, имя, отчество + добавлена роль для разграничения прав
CREATE TABLE Users (
    UserID INT PRIMARY KEY IDENTITY(1,1),
    Login VARCHAR(50) NOT NULL UNIQUE, -- ТЗ: "только по логину"
    LastName NVARCHAR(50) NOT NULL,    -- Фамилия
    FirstName NVARCHAR(50) NOT NULL,   -- Имя
    MiddleName NVARCHAR(50),           -- Отчество
    Role VARCHAR(30) NOT NULL CHECK (Role IN ('Администратор', 'Менеджер', 'Авторизованный пользователь'))
);

-- 2. Таблица Категорий
-- По ТЗ: категория, подкатегория
CREATE TABLE Categories (
    CategoryID INT PRIMARY KEY IDENTITY(1,1),
    CategoryName NVARCHAR(100) NOT NULL,
    ParentCategoryID INT NULL, -- Ссылка на саму себя для реализации подкатегорий
    FOREIGN KEY (ParentCategoryID) REFERENCES Categories(CategoryID)
);

-- 3. Таблица Товаров (Модели обуви)
-- По ТЗ: наименование, изображение, производство, состав, описание, цена
CREATE TABLE Shoes (
    ShoeID INT PRIMARY KEY IDENTITY(1,1),
    CategoryID INT NOT NULL,
    Name NVARCHAR(100) NOT NULL,          -- наименование
    Production NVARCHAR(100),             -- производство
    Composition NVARCHAR(200),            -- состав
    Description NVARCHAR(500),            -- описание
    Image NVARCHAR(255),                  -- изображение (путь к файлу)
    Price DECIMAL(10, 2) NOT NULL,        -- цена
    FOREIGN KEY (CategoryID) REFERENCES Categories(CategoryID)
);

-- 4. Таблица Размерного ряда и остатков (Склад)
-- По ТЗ: "доступное для заказа количество товарных позиций (сочетаний модели и размера)"
CREATE TABLE ShoeStock (
    ShoeID INT NOT NULL,
    Size INT NOT NULL,                    -- Размерный ряд
    Quantity INT NOT NULL DEFAULT 0,      -- Количество (доступное для заказа)
    PRIMARY KEY (ShoeID, Size),           -- Составной ключ: одна модель + один размер = уникальная позиция
    FOREIGN KEY (ShoeID) REFERENCES Shoes(ShoeID) ON DELETE CASCADE
);

-- 5. Таблица Заказов
-- По ТЗ: дата заказа, фамилия, имя, отчество клиента, итоговая сумма
CREATE TABLE Orders (
    OrderID INT PRIMARY KEY IDENTITY(1,1),
    OrderDate DATETIME NOT NULL DEFAULT GETDATE(), -- дата заказа
    UserID INT NULL,                               -- Может быть NULL, если заказ оформляет менеджер на гостя
    ClientFullName NVARCHAR(150) NOT NULL,         -- ФИО клиента (текстом, как требует ТЗ)
    TotalSum DECIMAL(10, 2) NOT NULL DEFAULT 0,    -- Итоговая сумма по заказу
    FOREIGN KEY (UserID) REFERENCES Users(UserID)
);

-- 6. Таблица Состава Заказа (Товарные позиции)
-- По ТЗ: товарная позиция, количество, цена за единицу товара
CREATE TABLE OrderItems (
    OrderItemID INT PRIMARY KEY IDENTITY(1,1),
    OrderID INT NOT NULL,
    ShoeID INT NOT NULL,
    Size INT NOT NULL,                     -- Какой именно размер заказали
    Quantity INT NOT NULL,                 -- Количество
    Price DECIMAL(10, 2) NOT NULL,         -- Цена за единицу товара (фиксируется на момент заказа)
    FOREIGN KEY (OrderID) REFERENCES Orders(OrderID) ON DELETE CASCADE,
    FOREIGN KEY (ShoeID, Size) REFERENCES ShoeStock(ShoeID, Size) -- Ссылка на конкретную позицию на складе
);