ПР№7 Создание базы данных в среде разработки
1. Откройте через Пуск SQL Server Management Studio 19. У вас откроется окно:
2. Нажмите на кнопку Connect. После подключения слева в окне Object Explorer вы сможете увидеть все свои проекты в ветке Databases
3. Для создания новой БД нажмите ПКМ в Object Explorer на Databases и выберите пункт New Databases… В открывшемся окне введите название новой базы данных FurnitureStore. Нажмите ОК.
4. В Object Explorer найдите новую БД и раскройте дерево объектов:
5. Для того чтобы создать таблицу вручную необходимо нажать ПКМ на Tables выбрать New - Table… Создайте таблицу Категории товаров (Categories) вручную:
| Атрибут | Тип данных | Описание |
| id | INT PRIMARY KEY | Уникальный идентификатор |
| name | VARCHAR(100) | Название категории (Кухни, Гостиные, Спальни) |
| parent_id | INT NULL | ID родительской категории (для иерархии) |
| description | TEXT | Описание категории |
| image_url | VARCHAR(255) | URL изображения категории |
| created_at | TIMESTAMP | Дата создания |
Чтобы поле сделать ключевым выполните следующее действие:
Для того, чтобы по умолчанию сделать поле нулевым поставьте галочку в Allow Nulls и в свойствах столбца (Column Properties) в поле Default Value or Binding: null.
Сохраните таблицу под именем Categories. Проверьте наличие таблицы в дереве объектов
Для того чтобы просмотреть таблицу нажмите на нее ПКМ и выберите пункт Edit Top 200 Rows:
У вас откроется:
Попробуйте заполнить одну строчку произвольными данными. Проверьте поля на целостность (чтобы нельзя было оставить поля пустыми, где это не предусмотрено).
6. Все остальные таблицы создайте с помощью языка SQL. Для этого нажмите ПКМ на название БД (FurnitureStore) и выберите пункт New Query. В Открывшемся окне введите код для создания таблиц на языке SQL.
Примечание. Можно ввести сразу несколько запросов на создание нескольких таблиц, но необходимо между запросами ставить разделитель (точку с запятой - ;).
Таблица Товары (Products)
Примечания:
1) Используйте ключевое слово IDENTITY для автоматической генерации уникального номера для каждой новой строки во всех таблицах в ключевом поле.
2) Для поля is_active используйте тип данных вместо Boolean – Bit (может принимать значения 0, 1 или Null), так как в sql server нет отдельного типа данных для булевых значений.
3) Используйте значения по умолчанию (ключевое слово Default) для атрибутов: warranty_months – Default 12, is_active - Default 1, created_at - DEFAULT CURRENT_TIMESTAMP.
4) Напишите ключевое слово NOT NULL при задании атрибутов: sku, name, category_id, price, cost_price.
| Атрибут | Тип данных | Описание |
| id | INT PRIMARY KEY IDENTITY | Уникальный идентификатор |
| sku | VARCHAR(50) UNIQUE | Артикул товара |
| name | VARCHAR(200) | Название товара |
| category_id | INT FOREIGN KEY | Ссылка на категорию |
| description | TEXT | Подробное описание |
| material | VARCHAR(100) | Материал изготовления |
| color | VARCHAR(50) | Цвет |
| dimensions | VARCHAR(100) | Габариты (ШхВхГ) |
| weight | DECIMAL(10,2) | Вес (кг) |
| price | DECIMAL(10,2) | Цена |
| cost_price | DECIMAL(10,2) | Себестоимость |
| warranty_months | INT | Гарантия (месяцев) |
| is_active | BOOLEAN | Активен ли товар |
| created_at | TIMESTAMP | Дата добавления |
Таблица Изображения товаров (Product_Images)
| Атрибут | Тип данных | Описание |
| id | INT PRIMARY KEY IDENTITY | Уникальный идентификатор |
| product_id | INT FOREIGN KEY | Ссылка на товар |
| image_url | VARCHAR(255) | URL изображения |
| sort_order | INT | Порядок сортировки |
| is_main | BOOLEAN | Основное изображение |
Таблица Склад (Warehouse)
| Атрибут | Тип данных | Описание |
| id | INT PRIMARY KEY | Уникальный идентификатор |
| product_id | INT FOREIGN KEY | Ссылка на товар |
| quantity | INT | Количество на складе |
| location | VARCHAR(50) | Место на складе (стеллаж, ячейка) |
| min_stock_level | INT | Минимальный остаток |
| last_restock_date | DATE | Дата последнего пополнения |
Таблица Клиенты (Customers)
| Атрибут | Тип данных | Описание |
| id | INT PRIMARY KEY | Уникальный идентификатор |
| first_name | VARCHAR(100) | Имя |
| last_name | VARCHAR(100) | Фамилия |
| | VARCHAR(100) UNIQUE | |
| phone | VARCHAR(20) | Телефон |
| address | TEXT | Адрес доставки |
| registration_date | DATE | Дата регистрации |
| loyalty_points | INT | Баллы лояльности |
Таблица Заказы (Orders)
| Атрибут | Тип данных | Описание |
| id | INT PRIMARY KEY | Уникальный идентификатор |
| order_number | VARCHAR(20) UNIQUE | Номер заказа |
| customer_id | INT FOREIGN KEY | Ссылка на клиента |
| order_date | TIMESTAMP | Дата оформления |
| delivery_address | TEXT | Адрес доставки |
| delivery_date | DATE | Планируемая дата доставки |
| status | ENUM | Статус (новый, подтвержден, собран, в доставке, доставлен, отменен) |
| total_amount | DECIMAL(10,2) | Общая сумма |
| payment_method | ENUM | Способ оплаты (карта, наличные, рассрочка) |
| payment_status | ENUM | Статус оплаты (не оплачен, частично, оплачен) |
| notes | TEXT | Комментарии к заказу |
Таблица Состав заказа (Order_Items)
| Атрибут | Тип данных | Описание |
| id | INT PRIMARY KEY | Уникальный идентификатор |
| order_id | INT FOREIGN KEY | Ссылка на заказ |
| product_id | INT FOREIGN KEY | Ссылка на товар |
| quantity | INT | Количество |
| unit_price | DECIMAL(10,2) | Цена на момент заказа |
| discount_percent | DECIMAL(5,2) | Скидка (%) |
| total_price | DECIMAL(10,2) | Итоговая цена позиции |
Таблица Поставщики (Suppliers)
| Атрибут | Тип данных | Описание |
| id | INT PRIMARY KEY | Уникальный идентификатор |
| name | VARCHAR(200) | Название компании |
| contact_person | VARCHAR(100) | Контактное лицо |
| phone | VARCHAR(20) | Телефон |
| | VARCHAR(100) | |
| address | TEXT | Юридический адрес |
| inn | VARCHAR(20) | ИНН |
Таблица Поставки (Shipments)
| Атрибут | Тип данных | Описание |
| id | INT PRIMARY KEY | Уникальный идентификатор |
| supplier_id | INT FOREIGN KEY | Ссылка на поставщика |
| shipment_number | VARCHAR(20) UNIQUE | Номер поставки |
| shipment_date | DATE | Дата поставки |
| expected_date | DATE | Ожидаемая дата |
| status | ENUM | Статус (ожидается, получена, частично) |
| total_cost | DECIMAL(10,2) | Общая стоимость поставки |
Таблица Состав поставки (Shipment_Items)
| Атрибут | Тип данных | Описание |
| id | INT PRIMARY KEY | Уникальный идентификатор |
| shipment_id | INT FOREIGN KEY | Ссылка на поставку |
| product_id | INT FOREIGN KEY | Ссылка на товар |
| quantity | INT | Количество |
| unit_cost | DECIMAL(10,2) | Закупочная цена |
| total_cost | DECIMAL(10,2) | Сумма по позиции |
Таблица Сотрудники (Employees)
| Атрибут | Тип данных | Описание |
| id | INT PRIMARY KEY | Уникальный идентификатор |
| first_name | VARCHAR(100) | Имя |
| last_name | VARCHAR(100) | Фамилия |
| position | VARCHAR(100) | Должность (менеджер, кладовщик, курьер) |
| phone | VARCHAR(20) | Телефон |
| | VARCHAR(100) | |
| hire_date | DATE | Дата приема |
| salary | DECIMAL(10,2) | Оклад |
| user_id | INT FOREIGN KEY | Ссылка на учетную запись |
Таблица Пользователи (Users)
| Атрибут | Тип данных | Описание |
| id | INT PRIMARY KEY | Уникальный идентификатор |
| username | VARCHAR(50) UNIQUE | Логин |
| password_hash | VARCHAR(255) | Хеш пароля |
| role | ENUM | Роль (admin, manager, warehouse, courier) |
| is_active | BOOLEAN | Активен ли пользователь |
| last_login | TIMESTAMP | Последний вход |
Таблица Доставка (Deliveries)
| Атрибут | Тип данных | Описание |
| id | INT PRIMARY KEY | Уникальный идентификатор |
| order_id | INT FOREIGN KEY | Ссылка на заказ |
| courier_id | INT FOREIGN KEY | Ссылка на курьера |
| planned_date | DATE | Плановая дата доставки |
| actual_date | DATE NULL | Фактическая дата доставки |
| status | ENUM | Статус (запланирована, в пути, доставлена) |
| tracking_number | VARCHAR(50) | Трек-номер |
| delivery_cost | DECIMAL(10,2) | Стоимость доставки |
Таблица Отзывы (Reviews)
| Атрибут | Тип данных | Описание |
| id | INT PRIMARY KEY | Уникальный идентификатор |
| product_id | INT FOREIGN KEY | Ссылка на товар |
| customer_id | INT FOREIGN KEY | Ссылка на клиента |
| rating | INT CHECK (1-5) | Оценка (1-5) |
| comment | TEXT | Текст отзыва |
| review_date | TIMESTAMP | Дата отзыва |
| is_approved | BOOLEAN | Опубликован |
Таблица Акции и скидки (Promotions)
| Атрибут | Тип данных | Описание |
| id | INT PRIMARY KEY | Уникальный идентификатор |
| name | VARCHAR(200) | Название акции |
| description | TEXT | Описание |
| discount_percent | DECIMAL(5,2) | Процент скидки |
| fixed_discount | DECIMAL(10,2) | Фиксированная скидка |
| start_date | DATE | Начало акции |
| end_date | DATE | Окончание акции |
| is_active | BOOLEAN | Активна |
Таблица Связь акций с товарами (Promotion_Products)
| Атрибут | Тип данных | Описание |
| promotion_id | INT PRIMARY KEY | Ссылка на акцию |
| product_id | INT PRIMARY KEY | Ссылка на товар |
Примечание. После написания всего скрипта – сохраните его. Нажмите на кнопку Execute
и выполните запросы. Если возникли ошибки – исправьте их.
7. Создайте схему БД. Для этого в дереве объектов нажмите ПКМ на пункт Database Diagrams и создайте New Database Diagram
В появившемся окне выберите все созданные таблицы (16 шт) и надмите Add. Если у вас отобразились не все таблицы, то нажмите кнопку Refresh, затем выделите и добавьте все таблицы с помощью кнопки Add.
В итоге выполнения практической работы вы получите БД вида:
Контрольные вопросы (ответить письменно в тетради):
1) Для чего используется CHECK?
2) Для чего используется IDENTITY?
3) Для чего используется UNIQUE?
4) Для чего используется DEFAULT?
5) Почему не использовался тип данных ENUM?
6) Почему не использовался тип данных BOOLEAN?
7) Что хранится с помощью типа данных TIMESTAMP?
8) Что хранится с помощью типа данных DECIMAL(10,2)?




