МДК.11.01 - QUIZ. Задания для самопроверки
В этом квизе представлены наборы данных в виде таблиц, каждая из которых находится в одной из нормальных форм базы данных: от сырых данных (RAW DATA) и ненормализованной формы (UNF) до шестой нормальной формы (6NF). Студентам предстоит проанализировать данные таблиц и определить, в какой нормальной форме они находятся. Обратите внимание, что в некоторых случаях отдельные таблицы могут находиться в более низких формах, однако если одна из таблиц удовлетворяет требованиям более высокой формы, принято считать, что вся база данных соответствует этой форме.
Список заданий:
Инфо
Здесь и далее в примерах будут использованы следующие обозначения:
- 🔑 - Первичный ключ
- 🔗 - Внешний ключ
- ⚠️ - Набор значений ограничен
1. Список покупок
Представлены данные о покупках клиентов, где каждый клиент может купить несколько товаров.
| customer_name | items_bought |
|---|---|
| Иван Иванов | Молоко, Хлеб |
| Сергей Сергеев | Яйца, Сахар, Молоко |
| John Smith | Bread, Milk, Eggs |
| Иван Иванов | Сахар |
Вопрос: В какой нормальной форме находятся эти данные?
Правильный ответ
UNF
Представленная таблица находится в UNF, потому что у нас есть неатомарные значения в колонке items_bought, где несколько товаров записаны в одной ячейке.
2. Проекты и задачи
Это система учёта проектов, в которой каждая задача относится к проекту, а у проекта есть руководитель. Таблица содержит данные о проекте, задачах и их исполнителях.
| 🔑 project_id | 🔑 task_id | task_name | assignee | project_manager |
|---|---|---|---|---|
| 1 | 101 | Создать макет | Иван Иванов | Петров Пётр |
| 1 | 102 | Разработать дизайн | Сергей Сергеев | Петров Пётр |
| 2 | 201 | Написать документацию | John Smith | Иванова Анна |
| 2 | 202 | Провести тестирование | Иван Иванов | Иванова Анна |
Вопрос: В какой нормальной форме находятся эти данные?
Правильный ответ
2NF
Таблица находится как минимум в 1NF, так как данные атомарны. Но есть частичная зависимость: атрибут project_manager зависит только от project_id, а не от всего составного ключа (project_id + task_id).
Следовательно, таблица нарушает требования 3NF, но полностью соответствует условиям 2NF.
3. Расписание занятий
Здесь представлено расписание занятий для студентов. В таблице хранятся данные о том, какие предметы студенты изучают в каждом классе. Первичный ключ в таблице отсутствует.
| 🔗 class_id | student_name | subject |
|---|---|---|
| 1 | Иван Иванов | Математика |
| 1 | Иван Иванов | Физика |
| 2 | Сергей Сергеев | Химия |
| 2 | Сергей Сергеев | Биология |
| 3 | John Smith | История |
| 3 | John Smith | English |
Вопрос: В какой нормальной форме находятся эти данные?
Правильный ответ
1NF
Представленная таблица находится в 1NF, так как все атрибуты содержат атомарные значения, и каждая запись уникальна.
4. Аренда автомобилей
Данные о системе аренды автомобилей, в которой хранится информация о датах аренды автомобилей клиентами. Каждая аренда связана с конкретным клиентом и автомобилем.
Таблица аренды
| 🔑 car_id | 🔑 rental_date | 🔗 customer_id |
|---|---|---|
| 101 | 2024-09-01 | 201 |
| 102 | 2024-09-02 | 202 |
| 101 | 2024-09-03 | 203 |
Таблица клиентов
| 🔑 customer_id | customer_name |
|---|---|
| 201 | Иван Иванов |
| 202 | Сергей Сергеев |
| 203 | John Smith |
Таблица автомобилей
| 🔑 car_id | car_model | license_plate |
|---|---|---|
| 101 | Toyota Camry | AA123BB |
| 102 | Honda Civic | BB234CC |
Вопрос: В какой нормальной форме находятся эти данные?
Правильный ответ
BCNF
Представленные таблицы находятся в BCNF, потому что в таблице аренды составной ключ (car_id + rental_date) определяет все атрибуты, и нет транзитивных зависимостей. Две другие таблицы (клиентов и автомобилей) технически находятся в 3NF, так как в них все неключевые атрибуты зависят только от ключей. Однако, поскольку таблица аренды находится в BCNF, принято считать, что и вся база данных соответствует BCNF.
5. Заказы и клиенты
Система заказов, где хранится информация о заказах клиентов. Таблица заказов связана с таблицей клиентов, которые делают эти заказы.
Таблица заказов
| 🔑 order_id | 🔗 customer_id | order_date |
|---|---|---|
| 1 | 101 | 2024-09-01 |
| 2 | 102 | 2024-09-02 |
| 3 | 103 | 2024-09-03 |
Таблица клиентов
| 🔑 customer_id | customer_name | customer_email |
|---|---|---|
| 101 | Иван Иванов | ivan@example.com |
| 102 | Сергей Сергеев | sergey@example.com |
| 103 | John Smith | john@example.com |
Вопрос: В какой нормальной форме находятся эти данные?
Правильный ответ
3NF
Представленные таблицы находятся в 3NF, потому что они удовлетворяют требованиям 2NF, и нет транзитивных зависимостей. Каждая таблица хранит только те данные, которые напрямую зависят от её первичного ключа. В таблице заказов все неключевые атрибуты зависят только от order_id, а в таблице клиентов — от customer_id.
6. Регистрация на курсы
Система регистрации студентов на курсы. Каждый студент может зарегистрироваться на несколько курсов но не больше установленного ограничения. Кроме того, для каждого курса также есть ограничения по количеству студентов. Оба ограничения регулируются на уровне логики СУБД.
Таблица регистрации студентов на курсы
| 🔑 🔗 student_id | 🔑 🔗 course_id | enrollment_date | courses_count |
|---|---|---|---|
| 1 | 101 | 2024-09-01 | 2 |
| 2 | 102 | 2024-09-02 | 1 |
| 3 | 103 | 2024-09-03 | 1 |
| 1 | 103 | 2024-09-04 | 2 |
Таблица студентов
| 🔑 student_id | student_name | selected_courses | ⚠️ max_courses |
|---|---|---|---|
| 1 | Иван Иванов | 2 | 2 |
| 2 | Сергей Сергеев | 1 | 3 |
| 3 | John Smith | 1 | 3 |
Таблица курсов
| 🔑 course_id | course_name | ⚠️ max_students |
|---|---|---|
| 101 | Математика | 30 |
| 102 | Физика | 25 |
| 103 | Химия | 20 |
Вопрос: В какой нормальной форме находятся эти данные?
Правильный ответ
DKNF
Таблица регистрации студентов на курсы находится в DKNF, потому что все ограничения основаны на ключах и доменах.
- Ограничение по ключам:
- комбинация
student_idиcourse_idуникальна для каждой записи.
- комбинация
- Доменные ограничения:
- Для каждого студента есть ограничение по количеству курсов, которые он может выбрать
selected_courses <= max_courses. - Для каждого курса установлено максимальное количество студентов
max_students.
- Для каждого студента есть ограничение по количеству курсов, которые он может выбрать
Здесь нет зависимостей, которые противоречат ограничениям доменов. Все зависимости, включая количество курсов и количество студентов, контролируются как ключами, так и доменными правилами, что соответствует доменно-ключевой нормальной форме DKNF. Другие таблицы (студентов и курсов) находятся в 3NF, но вся база считается соответствующей DKNF, потому что таблица регистрации удовлетворяет требованиям DKNF.
7. Производство товаров
В этой системе описан процесс производства товаров. Производство каждого товара проходит через несколько этапов, и каждый этап может быть выполнен разными поставщиками.
Таблица этапов производства
| 🔑 🔗 product_id | 🔑 🔗 stage_id | 🔑 🔗 supplier_id |
|---|---|---|
| 1 | 101 | 201 |
| 1 | 102 | 202 |
| 2 | 101 | 203 |
| 2 | 103 | 201 |
| 3 | 102 | 201 |
Таблица продуктов
| 🔑 product_id | product_name |
|---|---|
| 1 | Стол |
| 2 | Стул |
| 3 | Шкаф |
Таблица этапов
| 🔑 stage_id | stage_name |
|---|---|
| 101 | Сборка |
| 102 | Покраска |
| 103 | Упаковка |
Таблица поставщиков
| 🔑 supplier_id | supplier_name |
|---|---|
| 201 | Поставщик 1 |
| 202 | Поставщик 2 |
| 203 | Поставщик 3 |
Вопрос: В какой нормальной форме находятся эти данные?
Правильный ответ
5NF
Таблица этапов производства находится в 5NF, потому что в ней есть трёхсторонняя зависимость: товар ↔ этап ↔ поставщик.
- У каждого товара несколько этапов.
- Каждый этап может выполняться разными поставщиками.
- У товара может быть несколько поставщиков.
Если разложить такие данные только на пары (товар-этап, этап-поставщик, товар-поставщик), то при соединении мы получим лишние комбинации, которых в реальности нет.
Поэтому мы должны хранить именно комбинацию product_id + stage_id + supplier_id — это и есть пример ситуации для 5NF.
Остальные таблицы (продукты, этапы, поставщики) находятся как минимум в 3NF. Но база данных в целом считается находящейся в 5NF, так как самая сложная таблица соответствует этой нормальной форме.
5NF — данные нельзя разделить на пары, нужно хранить именно тройки.
8. Товары и поставщики
Эта система управляет поставками товаров в магазины. Один и тот же товар может поставляться в разные магазины от разных поставщиков.
Таблица поставок
| 🔑 🔗 product_id | 🔑 🔗 store_id | 🔑 🔗 supplier_id |
|---|---|---|
| 1 | 101 | 201 |
| 1 | 102 | 202 |
| 2 | 101 | 201 |
| 3 | 102 | 203 |
Таблица товаров
| 🔑 product_id | product_name |
|---|---|
| 1 | Хлеб |
| 2 | Молоко |
| 3 | Яйца |
Таблица поставщиков
| 🔑 supplier_id | supplier_name |
|---|---|
| 201 | Поставщик 1 |
| 202 | Поставщик 2 |
| 203 | Поставщик 3 |
Таблица магазинов
| 🔑 store_id | store_name |
|---|---|
| 101 | Магазин 1 |
| 102 | Магазин 2 |
| 103 | Магазин 3 |
Вопрос: В какой нормальной форме находятся эти данные?
Правильный ответ
4NF
Таблица поставок находится в 4NF, потому что у товара есть две независимые многозначные зависимости:
- один товар может поставляться в несколько магазинов,
- один товар может иметь нескольких поставщиков.
Каждая строка — это комбинация трёх значений: product_id, store_id, supplier_id. Здесь нет сложной «трёхсторонней» зависимости, как в случае с производством.
Данные можно разложить на пары (товар-магазин и товар-поставщик), и при соединении мы снова получим правильные данные без лишних комбинаций.
Поэтому достаточно требований 4NF.
4NF — данные можно разделить на пары без потерь.
9. Расписание работы сотрудников
Представлено расписание работы сотрудников с указанием периодов их работы и количества отработанных часов. Данные разделены по временным периодам и сотрудникам. Минимальное и Максимальное количество часов ограничены и регулируются на уровне логики СУБД.
Таблица работы сотрудников (по периодам)
| 🔑 employee_id | 🔑 work_period |
|---|---|
| 1 | [01-01-2024:05-01-2024] |
| 1 | [06-01-2024:10-01-2024] |
| 2 | [01-01-2024:05-01-2024] |
| 3 | [03-01-2024:07-01-2024] |
Таблица сотрудников
| 🔑 employee_id | employee_name |
|---|---|
| 1 | Иван Иванов |
| 2 | Сергей Сергеев |
| 3 | John Smith |
Таблица часов работы (по периодам)
| 🔑 employee_id | 🔑 work_period | hours_worked | ⚠️ min_hours | ⚠️ max_hours |
|---|---|---|---|---|
| 1 | [01-01-2024:05-01-2024] | 40 | 30 | 50 |
| 1 | [06-01-2024:10-01-2024] | 30 | 30 | 50 |
| 2 | [01-01-2024:05-01-2024] | 40 | 30 | 50 |
| 3 | [03-01-2024:07-01-2024] | 35 | 30 | 50 |
Вопрос: В какой нормальной форме находятся эти данные?
Правильный ответ
6NF
Таблицы находятся в 6NF, так как данные разбиты по каждому возможному атрибуту и используют временные маркеры для отображения периодов работы сотрудников. Каждая таблица хранит только один факт, что соответствует требованиям 6NF.
Добавлено доменное ограничение:
- для каждого сотрудника в конкретный период должно быть отработано минимум
30и максимум50часов. - зависимости управляются как ключами (
employee_id, work_period), так и доменами (ограничения по количеству часов работы).
Таким образом, каждая таблица соответствует 6NF, а данные могут быть изменены независимо без нарушения других зависимостей. Таблицы сотрудников и расписания работы по отдельности находятся в 5NF, но база данных считается соответствующей 6NF благодаря разделению данных и использованию доменных ограничений.
10. Сырые данные заказов
Даны данные о заказах, выгруженные из разных источников (чат-бот, Excel, ручной ввод).
Таблица заказов
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | order=101; customer=Иванов Иван; phone=+7-999-111-22-33; items=[MLK×2,BRED×1];paid=1 | ||||
| 2 | 102 | Петрова Мария | milk x1, bread x2 | 2024/09/01; card | |
| 3 | ID:107 | CUSTOMER:"Иван Иванов" | PAYMENTS:[card,bonus=100] | items: milk×1 | total=N/A |
| 4 | ЗАКАЗ №104, Клиент: Сергей Сергеев, Адрес: СПб, ул. Ленина, 1; Товары: Молоко(3) | ИТОГО=270₽ | |||
| 5 | order_id=105; items=BRED×1,EGG×10; note="доставить к 18:00" | file=photo_105.jpg | |||
| 6 | 106 | =ПУСТО |
Вопрос: В какой нормальной форме находятся эти данные?
Правильный ответ
Эти данные не находятся даже в UNF.
Про такие данные обычно говорят что это т.н. «сырые данные» (RAW DATA), которые требуют предварительной обработки перед тем как с ними можно будет начать работать средствами какой-либо СУБД.
- У строк нет фиксированного набора атрибутов.
- Используются разные форматы (текст, JSON, смешанные записи).
- Несколько сущностей (клиент, товары, оплата) объединены в одной ячейке.
- Нельзя выделить корректный ключ.