Рабочий лист: Практическое занятие №4: проектирование реляционной БД

Индивидуальный практический лист студента СИЭУиП (ОП.08 Основы проектирования баз данных, занятие 12)
Выберите ваш практический вариант проекта:
Вариант 1 — Комплексный проект

БД «Отдел кадров предприятия»

Постановка задачи и предметная область:
Вам поручено спроектировать реляционную базу данных кадровой службы производственного предприятия. Исходная ненормализованная таблица содержит следующие атрибуты:
Сотрудники_Кадры(Таб_номер, ФИО, Телефон, Паспортные_данные, Название_подразделения, Корпус, Номер_комнаты, Название_должности, Базовый_оклад, Номер_приказа, Дата_назначения, Ставка).

Бизнес-правила:
  • Каждый сотрудник имеет уникальный табельный номер, ФИО, телефон и серию/номер паспорта.
  • Предприятие разделено на структурные подразделения (отделы). Каждое подразделение расположено в определенном корпусе и кабинете.
  • Штатное расписание строго фиксирует базовый оклад за должностью. Оклад не зависит от подразделения или конкретного сотрудника.
  • Назначение сотрудника на должность оформляется официальным приказом с указанием даты назначения и ставки (от 0.25 до 1.5).

Шаг 1. Логическая схема и устранение транзитивных зависимостей (3NF)

Выявите транзитивные функциональные зависимости (в частности, оклада от сотрудника через должность: Таб_номер → Должность → Базовый_оклад). Спроектируйте не менее 3–4 таблиц в 3NF: departments, positions, employees, appointment_orders. Укажите состав полей, первичные и внешние ключи.

Шаг 2. DDL-спецификация (CREATE TABLE)

Напишите ANSI SQL DDL-скрипт создания таблиц в правильном топологическом порядке. Обязательно включите: PRIMARY KEY, FOREIGN KEY с ON DELETE RESTRICT для должностей и отделов, UNIQUE для паспорта/названия должности, NOT NULL, и предикаты CHECK (base_salary >= 19242.00) и CHECK (work_rate BETWEEN 0.25 AND 1.50).

Шаг 3. Контрольный набор тестовых кортежей (INSERT INTO)

Составьте не менее 5 согласованных операторов INSERT INTO, наполняющих все таблицы схемы в топологическом порядке. Включите 1 граничный кортеж (минимальный оклад или максимальная ставка 1.5) и 1 закомментированный контрпример с демонстрацией перехвата ошибки.

Шаг 4. Аналитический самоконтроль

Ответьте на вопросы: 1. Почему вынос оклада в таблицу positions устраняет аномалию обновления? 2. Почему для внешнего ключа сотрудника на должность недопустимо правило ON DELETE CASCADE?

Вариант 2 — Комплексный проект

БД «Аптечный склад»

Постановка задачи и предметная область:
Спроектируйте реляционную базу данных регионального фармацевтического логистического склада. Исходная ненормализованная таблица:
Склад_Медикаменты(Код_товара, Торговое_наименование, Форма_выпуска, Дозировка_мг, Производитель, Страна_производителя, Лицензия_производителя, Номер_партии, Дата_изготовления, Срок_годности, Количество_упаковок, Номер_накладной, Дата_отгрузки, Аптека_получатель).

Бизнес-правила:
  • Один производитель выпускает множество наименований препаратов. Страна и лицензия жестко привязаны к компании-производителю.
  • Каждый медикамент имеет форму выпуска (таблетки, ампулы, сироп) и дозировку.
  • Препараты поступают отдельными партиями. У каждой партии строго фиксированы дата производства, срок годности и количество на складе.
  • Срок годности обязан быть строго больше даты изготовления (expiry_date > manufacture_date).
  • Расходная накладная фиксирует отгрузку партии конкретной аптеке.

Шаг 1. Логическая схема и устранение транзитивных зависимостей (3NF)

Устраните транзитивную зависимость страны производителя от препарата: Код_товара → Производитель → Страна. Спроектируйте не менее 3–4 таблиц: manufacturers, medicines, batches, sales_invoices. Обоснуйте приведение схемы к 3NF.

Шаг 2. DDL-спецификация (CREATE TABLE)

Напишите DDL-скрипт с типами INT, VARCHAR(N), DATE, NUMERIC. Задайте PRIMARY KEY, FOREIGN KEY с ON DELETE RESTRICT, ограничение CHECK (dosage_mg > 0), CHECK (package_quantity >= 0) и контроль срока годности CHECK (expiry_date > manufacture_date).

Шаг 3. Контрольный набор тестовых кортежей (INSERT INTO)

Составьте не менее 5 согласованных операторов INSERT INTO в топологическом порядке. Приведите закомментированный негативный тест с попыткой вставить партию с просроченной датой годности относительно даты выпуска.

Шаг 4. Аналитический самоконтроль

Ответьте на вопросы: 1. К какой аномалии привело бы хранение лицензии завода в строке каждой отдельной партии препарата? 2. Почему проверка срока годности должна быть объявлена как ограничение CHECK на уровне СУБД, а не только на клиенте?

Вариант 3 — Комплексный проект

БД «Учебный центр дополнительного образования»

Постановка задачи и предметная область:
Разработайте реляционную базу данных коммерческого центра профессиональной переподготовки. Исходная денормализованная таблица:
Договоры_Обучение(Код_слушателя, ФИО_слушателя, Телефон, Email, Код_группы, Название_курса, Полная_стоимость_курса, Академические_часы, Дата_старта_группы, Номер_платежа, Дата_оплаты, Внесенная_сумма_руб, Статус_оплаты).

Бизнес-правила:
  • В учебном центре реализуются типовые образовательные программы (курсы). Стоимость программы и объем часов строго фиксированы за курсом.
  • По курсу формируются учебные группы с определенной датой старта занятий.
  • Слушатель зачисляется в учебную группу.
  • Оплата может вноситься частями (рассрочка). Каждый платеж фиксирует внесенную сумму (payment_amount > 0).
  • Общая сумма платежей не должна превышать полную стоимость курса (каскадный контроль статуса оплаты).

Шаг 1. Логическая схема и устранение транзитивных зависимостей (3NF)

Устраните зависимость параметров курса от учебной группы: Код_группы → Код_курса → (Стоимость, Часы). Спроектируйте 4 таблицы в 3NF: courses, study_groups, students, payments. Укажите первичные и внешние ключи.

Шаг 2. DDL-спецификация (CREATE TABLE)

Напишите DDL-скрипт с типами NUMERIC(10,2) для сумм, INT для часов и ключей, VARCHAR с ограничением длины. Задайте UNIQUE на email слушателя, CHECK (total_hours > 0), CHECK (course_fee >= 5000.00), CHECK (payment_amount > 0) и правила ссылочной целостности.

Шаг 3. Контрольный набор тестовых кортежей (INSERT INTO)

Сформируйте не менее 5 согласованных кортежей INSERT INTO, демонстрирующих платежи нескольких слушателей. Приведите закомментированный негативный тест с попыткой вставить отрицательную сумму платежа.

Шаг 4. Аналитический самоконтроль

Ответьте на вопросы: 1. Почему удаление курса из каталога должно блокироваться (RESTRICT), если по нему уже созданы учебные группы? 2. Какая аномалия вставки возникла бы, если бы курсы хранились в одной таблице со студентами?

Вариант 4 — Комплексный проект

БД «Станция техобслуживания (СТО)»

Постановка задачи и предметная область:
Спроектируйте архитектуру реляционной базы данных автосервисного центра. Исходная денормализованная таблица:
Заказы_СТО(Код_автомобиля, Госномер, VIN_номер, Марка_модель, Год_выпуска, ФИО_владельца, Телефон_владельца, Номер_заказ_наряда, Дата_приема, Пробег_км, Описание_неисправности, Код_работы, Наименование_работы, Нормо_часы, Стоимость_нормо_часа).

Бизнес-правила:
  • Один клиент может владеть несколькими автомобилями. Данные владельца не зависят от конкретного ремонта.
  • Автомобиль однозначно идентифицируется VIN-кодом (17 символов) и госномером.
  • Каждый визит оформляется заказ-нарядом с фиксацией текущего пробега (mileage >= 0).
  • В рамках одного заказ-наряда может выполняться несколько видов ремонтных работ (связь 1:M «мастер-детали»).

Шаг 1. Логическая схема и устранение транзитивных зависимостей (3NF)

Устраните зависимость контактных данных владельца от автомобиля и заказ-наряда: Заказ_наряд → Автомобиль → Владелец. Спроектируйте 4 таблицы: clients, vehicles, repair_orders, work_items. Обоснуйте ключи и связи.

Шаг 2. DDL-спецификация (CREATE TABLE)

Напишите DDL-скрипт с типами CHAR(17) для VIN, VARCHAR(12) для госномера, NUMERIC для стоимости. Задайте UNIQUE(vin), UNIQUE(license_plate), CHECK (mileage >= 0), CHECK (labor_hours > 0), правило ON DELETE RESTRICT для клиентов и автомобилей, и ON DELETE CASCADE для таблицы работ work_items при удалении заказ-наряда.

Шаг 3. Контрольный набор тестовых кортежей (INSERT INTO)

Сформируйте не менее 5 согласованных кортежей INSERT INTO, покрывающих все 4 таблицы. Приведите закомментированный негативный тест с попыткой вставить отрицательный пробег или работу с repair_order_id, отсутствующим в базе.

Шаг 4. Аналитический самоконтроль

Ответьте на вопросы: 1. Почему для связи repair_orders → work_items допустимо правило ON DELETE CASCADE, а для связи clients → vehicles оно категорически запрещено? 2. Зачем нужен суррогатный ключ vehicle_id INT, если VIN-код уникален?

Данные успешно сохранены в браузере!