- •Аннотация
- •Содержание
- •Введение
- •1. Формулировка задания
- •1.1. Задание
- •1.2. Структура идз
- •Описание предметной области
- •Проектирование базы данных
- •Создание бАзы данных
- •Создание таблиц и ограничений целостности
- •Заполнение таблиц данными
- •Заполнение таблицы «Staff» (Сотрудники)
- •Заполнение таблицы «Tables» (Столы):
- •Заполнение таблицы «Categories» (Категории)
- •Заполнение таблицы «MenuItems» (Меню)
- •Заполнение таблицы «Orders» (Заказы)
- •Заполнение таблицы «OrderItems» (Позиции заказа)
- •Заполнение таблицы «Payments» (Платежи)
- •Разработка объектов промежуточного слоя
- •Хранимые процедуры
- •Процедура «CreateOrder» для создания нового заказа
- •Процедура «AddItemToOrder» для добавления позиций в заказ
- •Процедура «SetOrderWaitingForPayment» для перевода заказа в статус ожидания оплаты
- •Процедура «PayOrder» для оплаты заказа
- •Представления
- •Представление «ActiveOrders» для просмотра активных заказов
- •Представление «WaiterDailyRevenue», показывающее выручку, принесённую каждым из официантов
- •Представление «DailyOrderStats», показывающее по дням заработок ресторана, оплаченные заказы, средний чек
- •Представление «OrdersByWaiterStatus», показывающее количество заказов, обслуженных каждым из официантов по статусам заказа
- •Функции
- •Скалярная функция «OrderTotal» для подсчета стоимости заказа
- •Табличная функция «GetOrdersWithTotal», которая возвращает блюда по заказам
- •Табличная функция «GetMenuItemsByAvailability», показывающая оставшиеся блюда
- •Табличная функция «GetLastOrderItems» возвращающая последние блюда в заказах
- •Скалярная функция «MenuItemSalesPaid» для подсчета проданных позиций блюд в день
- •Разработка триггеров
- •Триггер «InsertWaiterTable» для вставки в таблицу WaiterTables, когда происходит заказ
- •Триггер «CheckStock», уменьшающий количество блюд в MenuItems и предупреждающий, если блюда закончились
- •Триггер «PreventWaitingPaymentWithoutItems», проверяющий пустой заказ
- •Разработка стратегии резервного копирования и восстановления
- •Процедура полного резервного копирования
- •Процедура дифференциального резервного копирования
- •Процедура резервного копирования журнала транзакций
- •Процедура тестирования всех бэкапов
- •Автоматизация через sql server agent
- •Процедура восстановления
- •Заключение
- •Список использованных источников
Создание таблиц и ограничений целостности
Таблица “Staff”
Таблица 1. Структура таблицы «Staff»
Описание структуры таблицы БД |
Наименование таблицы БД: Таблица сотрудников |
Имя таблицы: Staff |
||||||
Дата разработки: 20.10.2025 |
||||||||
Порядковый номер таблицы: 1 |
||||||||
|
|
|
|
|
|
|
||
|
№ п/п |
Наименование поля |
Спецификация данных |
|
||||
|
Имя поля |
Тип данных |
Ключ |
Ограничения целостности |
|
|||
|
1 |
Идентификатор |
StaffID |
INT |
P |
PRIMARY KEY |
|
|
|
2 |
Имя |
FirstName |
nvarchar(50) |
|
NOT NULL |
|
|
|
3 |
Фамилия |
LastName |
nvarchar(50) |
|
NOT NULL |
|
|
|
4 |
Отчество |
Patronymic |
nvarchar(50) |
|
|
|
|
|
5 |
Должность |
Position |
nvarchar(30) |
|
NOT NULL, CHECK (Position IN ('Официант', 'Повар', 'Администратор', 'Бармен')) |
|
|
|
6 |
Номер телефона |
Phone |
nvarchar(20) |
|
NULL |
|
|
|
7 |
Дата найма |
HireDate |
DATE |
|
DEFAULT GETDATE() |
|
|
|
8 |
Зарплата |
Salary |
DECIMAL(10,2) |
|
CHECK (Salary >= 0) |
|
|
|
9 |
Статус |
IsActive |
BIT |
|
NOT NULL, DEFAULT 1 |
|
|
|
|
|
|
|
|
|
|
|
Запрос для создания таблицы сотрудников:
CREATE TABLE rest.Staff (
StaffID INT IDENTITY(1,1) PRIMARY KEY,
FirstName NVARCHAR(50) NOT NULL,
LastName NVARCHAR(50) NOT NULL,
Patronymic NVARCHAR(50),
Position NVARCHAR(30) NOT NULL CHECK (Position IN ('Официант', 'Повар', 'Администратор', 'Бармен')),
Phone NVARCHAR(20),
HireDate DATE DEFAULT GETDATE(),
Salary DECIMAL(10,2) CHECK (Salary >= 0),
IsActive BIT DEFAULT 1
);
GO
Проверим наличие созданной таблицы (рис. 4).
Рисунок 4. Созданная таблица «Staff»
Таблица “Categories”
Таблица 2. Структура таблицы «Categories»
Описание структуры таблицы БД |
Наименование таблицы БД: Таблица категорий меню |
Имя таблицы: Categories |
|||||||
Дата разработки: 20.10.2025 |
|||||||||
Порядковый номер таблицы: 2 |
|||||||||
|
|
|
|
|
|
|
|||
|
№ п/п |
Наименование поля |
Спецификация данных |
|
|||||
|
Имя поля |
Тип данных |
Ключ |
Ограничения целостности |
|
||||
|
1 |
Идентификатор |
CategoryID |
INT |
P |
PRIMARY KEY |
|
||
|
2 |
Название |
CategoryName |
nvarchar(50) |
|
NOT NULL UNIQUE |
|
||
|
3 |
Описание |
Description |
nvarchar(255) |
|
NULL |
|
||
|
4 |
Порядок |
DisplayOrder |
INT |
|
DEFAULT 0 |
|
||
|
5 |
Статус |
IsActive |
BIT |
|
DEFAULT 1 |
|
||
|
|
|
|
|
|
|
|
||
Выполним запрос для создания таблицы категорий меню.
CREATE TABLE rest.Categories (
CategoryID INT IDENTITY(1,1) PRIMARY KEY,
CategoryName NVARCHAR(50) NOT NULL UNIQUE,
Description NVARCHAR(255),
DisplayOrder INT DEFAULT 0,
IsActive BIT DEFAULT 1
);
GO
Таблица успешно создана (рис. 5).
Рисунок 5. Созданная таблица «Categories»
Таблица “Tables”
Таблица 3. Структура таблицы «Tables»
Описание структуры таблицы БД |
Наименование таблицы БД: Таблица столов |
Имя таблицы: Tables |
||||||||
Дата разработки: 20.10.2025 |
||||||||||
Порядковый номер таблицы: 3 |
||||||||||
|
|
|
|
|
|
|
||||
|
№ п/п |
Наименование поля |
Спецификация данных |
|
||||||
|
Имя поля |
Тип данных |
Ключ |
Ограничения целостности |
|
|||||
|
1 |
Идентификатор |
TableID |
INT |
P |
PRIMARY KEY |
|
|||
|
2 |
Номер стола |
TableNumber |
nvarchar(10) |
U |
NOT NULL UNIQUE |
|
|||
|
3 |
Вместимость |
Capacity |
INT |
|
CHECK (Capacity > 0 AND Capacity <= 20) |
|
|||
|
4 |
Статус |
Status |
nvarchar(20) |
|
DEFAULT 'Свободен' CHECK (Status IN ('Свободен', 'Занят')) |
|
|||
|
|
|
|
|
|
|
|
|||
Запрос для создания таблицы столов:
CREATE TABLE rest.Tables (
TableID INT IDENTITY(1,1) PRIMARY KEY,
TableNumber NVARCHAR(10) NOT NULL UNIQUE,
Capacity INT NOT NULL CHECK (Capacity > 0 AND Capacity <= 20),
Status NVARCHAR(20) DEFAULT 'Свободен'
CHECK (Status IN ('Свободен', 'Занят'))
);
GO
Таблица успешно создана (рис. 6).
Рисунок 6. Созданная таблица «Tables»
Таблица “MenuItems”
Таблица 4. Структура таблицы «MenuItems»
Описание структуры таблицы БД |
Наименование таблицы БД: Таблица блюд |
Имя таблицы: MenuItems |
||||||||
Дата разработки: 20.10.2025 |
||||||||||
Порядковый номер таблицы: 4 |
||||||||||
|
|
|
|
|
|
|
||||
|
№ п/п |
Наименование поля |
Спецификация данных |
|
||||||
|
Имя поля |
Тип данных |
Ключ |
Ограничения целостности |
|
|||||
|
1 |
Идентификатор |
ItemID |
INT |
P |
PRIMARY KEY |
|
|||
|
2 |
Название |
ItemName |
nvarchar(100) |
|
NOT NULL |
|
|||
|
3 |
Описание |
Description |
nvarchar(255) |
|
NULL |
|
|||
|
4 |
Идентификатор категории |
CategoryID |
INT |
F |
NOT NULL, FOREIGN KEY REFERENCES Categories(CategoryID) |
|
|||
|
5 |
Цена |
Price |
DECIMAL(10,2) |
|
NOT NULL, CHECK (Price >= 0) |
|
|||
|
6 |
Себестоимость |
CostPrice |
DECIMAL(10,2) |
|
CHECK (CostPrice >= 0) |
|
|||
|
7 |
Время приготовления |
CookingTime |
INT |
|
CHECK (CookingTime >= 0) |
|
|||
|
8 |
Доступность |
IsAvailable |
BIT |
|
DEFAULT 1 |
|
|||
|
9 |
Запас |
Stock |
INT |
|
NOT NULL |
|
|||
|
|
|
|
|
|
|
|
|||
Запрос для создания таблицы позиций меню:
CREATE TABLE rest.MenuItems (
ItemID INT IDENTITY(1,1) PRIMARY KEY,
ItemName NVARCHAR(100) NOT NULL,
Description NVARCHAR(255),
CategoryID INT NOT NULL,
Price DECIMAL(10,2) NOT NULL CHECK (Price >= 0),
CostPrice DECIMAL(10,2) CHECK (CostPrice >= 0),
CookingTime INT CHECK (CookingTime >= 0),
IsAvailable BIT DEFAULT 1,
Stock INT NOT NULL DEFAULT 0,
FOREIGN KEY (CategoryID) REFERENCES rest.Categories(CategoryID)
);
GO
Таблица успешно создана (рис. 7).
Рисунок 7. Созданная таблица «MenuItems»
Таблица “Orders”
Таблица 5. Структура таблицы «Orders»
Описание структуры таблицы БД |
Наименование таблицы БД: Таблица заказов |
Имя таблицы: Orders |
|||||||
Дата разработки: 20.10.2025 |
|||||||||
Порядковый номер таблицы: 5 |
|||||||||
|
|
|
|
|
|
|
|
||
|
№ п/п |
Наименование поля |
Спецификация данных |
|
|||||
|
Имя поля |
Тип данных |
Ключ |
Ограничения целостности |
|
||||
|
1 |
Идентификатор |
OrderID |
INT |
P |
PRIMARY KEY |
|
||
|
2 |
Идентификатор стола |
TableID |
INT |
F |
NOT NULL, FOREIGN KEY REFERENCES Tables(TableID) |
|
||
|
3 |
Идентификатор официанта |
WaiterID |
INT |
F |
NOT NULL, FOREIGN KEY REFERENCES Staff(StaffID) |
|
||
|
4 |
Дата и время заказа |
OrderDateTime |
DATETIME2 |
|
DEFAULT GETDATE() |
|
||
|
5 |
Статус заказа |
Status |
nvarchar(20) |
|
DEFAULT 'Принят' CHECK (Status IN ('Принят', 'Оплачен', 'Ожидает оплаты')) |
|
||
|
6 |
Общая сумма |
TotalAmount |
DECIMAL(10,2) |
|
DEFAULT 0 CHECK (TotalAmount >= 0) |
|
||
|
7 |
Примечания |
Notes |
nvarchar(500) |
|
NULL |
|
||
|
8 |
Дата завершения |
CompletedDate |
DATETIME2 |
|
NULL |
|
||
|
|
|
|
|
|
|
|||
Запрос для создания таблицы заказов:
CREATE TABLE rest.Orders (
OrderID INT IDENTITY(1,1) PRIMARY KEY,
TableID INT NOT NULL,
WaiterID INT NOT NULL,
OrderDateTime DATETIME2 DEFAULT GETDATE(),
Status NVARCHAR(20) DEFAULT 'Принят'
CHECK (Status IN ('Принят', 'Оплачен', 'Ожидает оплаты')),
TotalAmount DECIMAL(10,2) DEFAULT 0 CHECK (TotalAmount >= 0),
Notes NVARCHAR(500),
CompletedDate DATETIME2,
FOREIGN KEY (TableID) REFERENCES rest.Tables(TableID),
FOREIGN KEY (WaiterID) REFERENCES rest.Staff(StaffID)
);
GO
Таблица успешно создана (рис. 8).
Рисунок 8. Созданная таблица «Orders»
Таблица “OrderItems”
Таблица 6. Структура таблицы «OrderItems»
Описание структуры таблицы БД |
Наименование таблицы БД: Позиции заказа |
Имя таблицы: OrderItems |
||||||
Дата разработки: 20.10.2025 |
||||||||
Порядковый номер таблицы: 6 |
||||||||
|
|
|
|
|
|
|
||
|
№ п/п |
Наименование поля |
Спецификация данных |
|
||||
|
Имя поля |
Тип данных |
Ключ |
Ограничения целостности |
|
|||
|
1 |
Идентификатор |
OrderItemID |
INT |
P |
PRIMARY KEY |
|
|
|
2 |
Идентификатор заказа |
OrderID |
INT |
F |
NOT NULL, FOREIGN KEY REFERENCES Orders(OrderID) ON DELETE CASCADE |
|
|
|
3 |
Идентификатор блюда |
ItemID |
INT |
F |
NOT NULL, FOREIGN KEY REFERENCES MenuItems(ItemID) |
|
|
|
4 |
Количество |
Quantity |
INT |
|
NOT NULL, DEFAULT 1, CHECK (Quantity > 0) |
|
|
|
5 |
Цена |
UnitPrice |
DECIMAL(10,2) |
|
NOT NULL, CHECK(UnitPrice >= 0) |
|
|
|
6 |
Стоимость по позиции |
ItemTotal |
DECIMAL(10,2) |
|
AS (Quantity * UnitPrice) |
|
|
|
7 |
Особые пожелания |
SpecialInstructions |
nvarchar(200) |
|
NULL |
|
|
|
|
|
|
|
|
|
|
|
Запрос для создания таблицы позиций заказа:
CREATE TABLE rest.OrderItems (
OrderItemID INT IDENTITY(1,1) PRIMARY KEY,
OrderID INT NOT NULL,
ItemID INT NOT NULL,
Quantity INT NOT NULL DEFAULT 1 CHECK (Quantity > 0),
UnitPrice DECIMAL(10,2) NOT NULL CHECK (UnitPrice >= 0),
ItemTotal AS (Quantity * UnitPrice),
SpecialInstructions NVARCHAR(200),
FOREIGN KEY (OrderID) REFERENCES rest.Orders(OrderID) ON DELETE CASCADE,
FOREIGN KEY (ItemID) REFERENCES rest.MenuItems(ItemID)
);
GO
Таблица успешно создана (рис. 9).
Рисунок 9. Созданная таблица «OrderItems»
Таблица “Payments”
Таблица 7. Структура таблицы «Payments»
Описание структуры таблицы БД |
Наименование таблицы БД: Платежи |
Имя таблицы: Payments |
||||||
Дата разработки: 20.10.2025 |
||||||||
Порядковый номер таблицы: 7 |
||||||||
|
|
|
|
|
|
|
||
|
№ п/п |
Наименование поля |
Спецификация данных |
|
||||
|
Имя поля |
Тип данных |
Ключ |
Ограничения целостности |
|
|||
|
1 |
Идентификатор |
PaymentID |
INT |
P |
PRIMARY KEY |
|
|
|
2 |
Идентификатор заказа |
OrderID |
INT |
F |
NOT NULL, FOREIGN KEY REFERENCES Orders(OrderID) |
|
|
|
3 |
Способ оплаты |
PaymentMethod |
NVARCHAR(20) |
|
NOT NULL, CHECK (PaymentMethod IN ('Наличные', 'Карта', 'Онлайн')) |
|
|
|
4 |
Сумма платежа |
Amount |
DECIMAL(10,2) |
|
NOT NULL,CHECK(Amount> 0) |
|
|
|
5 |
Чаевые |
TipAmount |
DECIMAL(10,2) |
|
DEFAULT 0 CHECK (TipAmount>=0) |
|
|
|
6 |
Оплата |
TotalAmount |
AS (Amount + TipAmount) |
|
|
|
|
|
7 |
Дата и время платежа |
PaymentDateTime |
DATETIME2 |
|
DEFAULT GETDATE() |
|
|
|
|
|
|
|
|
|
|
|
Запрос для создания таблицы платежей:
CREATE TABLE rest.Payments (
PaymentID INT IDENTITY(1,1) PRIMARY KEY,
OrderID INT NOT NULL,
PaymentMethod NVARCHAR(20) NOT NULL
CHECK (PaymentMethod IN ('Наличные', 'Карта', 'Онлайн')),
Amount DECIMAL(10,2) NOT NULL CHECK (Amount > 0),
TipAmount DECIMAL(10,2) DEFAULT 0 CHECK (TipAmount >= 0),
TotalAmount AS (Amount + TipAmount) PERSISTED,
PaymentDateTime DATETIME2 NOT NULL DEFAULT GETDATE(),
FOREIGN KEY (OrderID) REFERENCES rest.Orders(OrderID)
);
GO
Таблица успешно создана (рис. 10).
Рисунок 10. Созданная таблица «Payments»
Таблица “WaiterTables”
Таблица 8. Структура таблицы «WaiterTables»
Описание структуры таблицы БД |
Наименование таблицы БД: Таблица привязки официанта к столу |
Имя таблицы: WaiterTables |
||||||||
Дата разработки: 20.10.2025 |
||||||||||
Порядковый номер таблицы: 8 |
||||||||||
|
|
|
|
|
|
|
||||
|
№ п/п |
Наименование поля |
Спецификация данных |
|
||||||
|
Имя поля |
Тип данных |
Ключ |
Ограничения целостности |
|
|||||
|
1 |
Идентификатор |
WaiterTableID |
INT |
P |
PRIMARY KEY |
|
|||
|
2 |
Официант |
StaffID |
INT |
F |
NOT NULL FOREIGN KEY REFERENCES Staff(StaffID) |
|
|||
|
3 |
Стол |
TableID |
INT |
F |
NOT NULL FOREIGN KEY REFERENCES Tables(TableID) |
|
|||
|
4 |
Начало работы |
StartTime |
DATETIME |
|
NOT NULL |
|
|||
|
5 |
Конец работы |
EndTime |
DATETIME |
|
NULL |
|
|||
|
|
|
|
|
|
|
|
|||
Запрос для создания таблицы официантов и привязанных к ним столов:
CREATE TABLE rest.WaiterTables (
WaiterTableID INT IDENTITY(1,1) PRIMARY KEY,
StaffID INT NOT NULL,
TableID INT NOT NULL,
StartTime DATETIME NOT NULL DEFAULT GETDATE(),
EndTime DATETIME NULL,
FOREIGN KEY (StaffID) REFERENCES rest.Staff(StaffID),
FOREIGN KEY (TableID) REFERENCES rest.Tables(TableID)
);
GO
Таблица успешно создана (рис. 11).
Рисунок 11. Созданная таблица «WaiterTables»
