ERD-диаграммы. Нормализация.
ERD-диаграммы
ERD (Entity-Relationship Diagram) — это мощный инструмент моделирования баз данных, который позволяет графически изображать сущности, их атрибуты и связи между ними. Для студентов важно не только понимать базовые элементы, но и уметь применять ERD на практике для сложных систем, а также знать концепции нормализации и кардинальности.
Основные элементы ERD-диаграммы
- Сущности (Entities) — это объекты, для которых вы будете создавать таблицы в базе данных. Сущности — это, по сути, таблицы базы данных, каждая из которых содержит информацию об объектах.Примеры сущностей:
- Атрибуты (Attributes) — свойства сущностей, которые будут колонками в таблицах базы данных. Существуют несколько типов атрибутов:
- Простые атрибуты — атрибуты, которые нельзя разделить на более мелкие элементы (например, имя).
- Составные атрибуты — атрибуты, которые можно разделить на составляющие (например, "Полное имя" можно разделить на "Имя" и "Фамилия").
- Многозначные атрибуты — атрибуты, у которых может быть несколько значений для одной сущности (например, у студента может быть несколько номеров телефонов).
- Производные атрибуты — это атрибуты, которые вычисляются на основе других данных. Например, "Возраст" может быть вычислен на основе даты рождения.
- Ключевые атрибуты (Keys) — специальные атрибуты, которые обеспечивают уникальную идентификацию записей в таблице.
- Первичный ключ (Primary Key) — уникальный атрибут, который идентифицирует каждую запись. Он всегда должен быть уникальным и не может быть пустым (NULL).
- Внешний ключ (Foreign Key) — атрибут, который связывает одну сущность с другой. Он указывает на первичный ключ в другой таблице.
- Связи (Relationships) — они определяют, как сущности взаимодействуют друг с другом. Например, один клиент может сделать много заказов, а каждый заказ связан с одним или несколькими продуктами.
Типы связей
- Один к одному (1:1) — когда одному объекту из одной сущности соответствует ровно один объект другой сущности. Это довольно редкий тип связи.Пример: Один человек — один паспорт.
- Один ко многим (1) — одна сущность может быть связана с несколькими объектами другой сущности, но объекты другой сущности могут быть связаны только с одним объектом первой.Пример: Один автор может написать много книг, но каждая книга имеет только одного автора.
- Многие ко многим (M) — каждая сущность может быть связана с множеством объектов другой сущности, и наоборот.Пример: Много студентов могут посещать много курсов, и каждый курс может посещать несколько студентов.
Для связи Mв реляционных базах данных обычно создают промежуточную таблицу (junction table), которая разбивает связь на две связи "Один ко многим" и содержит внешние ключи двух связанных сущностей.
Кардинальность и обязательность (Cardinality and Participation)
- Кардинальность показывает, сколько экземпляров одной сущности могут быть связаны с экземплярами другой. Она включает:Пример: В связи "1" один заказчик может сделать много заказов.
- Обязательность (Participation) описывает, является ли участие сущности в связи обязательным или нет.
Дополнительные концепции
1. Нормализация
ERD помогает на ранних этапах проектирования базы данных избегать избыточности данных (дублирования). Процесс нормализации разделяет данные на небольшие, логически связанные таблицы, устраняя повторяющиеся данные и улучшая целостность базы данных.
- 1NF (Первая нормальная форма) — данные в каждой колонке должны быть атомарными (неделимыми).
- 2NF (Вторая нормальная форма) — все атрибуты должны зависеть от первичного ключа целиком.
- 3NF (Третья нормальная форма) — данные не должны зависеть от неключевых атрибутов.
2. Слабые сущности (Weak Entities)
Слабые сущности — это такие сущности, которые не могут существовать без другой сущности. У них нет собственного первичного ключа, поэтому они используют внешний ключ для уникальной идентификации.
Пример: Сущность "Заказ" может быть слабой по отношению к сущности "Клиент", так как заказ не может существовать без клиента.
3. Генерализация и специализация
Это концепция, которая используется для описания иерархических отношений между сущностями.
- Генерализация — объединение нескольких схожих сущностей в одну более общую сущность. Например, сущности "Сотрудник" и "Клиент" можно обобщить в сущность "Человек".
- Специализация — наоборот, это процесс разделения общей сущности на более специфические. Например, сущность "Человек" можно разделить на "Учитель" и "Студент".
Пример сложной ERD-диаграммы
Представим пример для онлайн-магазина:
Этот пример показывает, как несколько сущностей взаимодействуют друг с другом через связи "Один ко многим" и "Многие ко многим".
Нормализация — это процесс организации данных в базе данных для минимизации дублирования и обеспечения целостности данных. Основная цель нормализации — устранить аномалии обновления, вставки и удаления данных, а также оптимизировать структуру базы данных для эффективного хранения и обработки информации. Нормализация делится на несколько шагов, называемых нормальными формами (NF), каждая из которых решает определённые проблемы с организацией данных.
Основные концепции нормализации
1. Аномалии данных
Аномалии возникают, когда структура базы данных недостаточно оптимизирована. Вот основные типы аномалий:
- Аномалия обновления: Из-за дублирования данных при изменении одного из экземпляров может потребоваться обновление всех копий. Если какая-то копия не обновлена, данные становятся несогласованными.
- Аномалия вставки: Когда нельзя вставить данные в базу, не добавив при этом избыточную информацию.
- Аномалия удаления: Удаление данных может привести к утрате полезной информации, которую не планировалось удалять.
2. Первичный ключ
Для нормализации важно определить первичный ключ — атрибут или набор атрибутов, который уникально идентифицирует запись в таблице.
Нормальные формы
Первая нормальная форма (1NF)
1NF требует, чтобы все значения атрибутов в таблице были атомарными, то есть неделимыми. Это значит, что каждая колонка должна содержать одно значение, а не несколько. В таблице не должно быть повторяющихся групп данных или списков в одной ячейке.
Здесь в колонке "Предметы" хранится несколько значений. Это нарушает 1NF.
Теперь каждое значение атомарно, и таблица находится в 1NF.
Вторая нормальная форма (2NF)
2NF требует, чтобы таблица соответствовала 1NF и не имела частичных зависимостей. Это значит, что все атрибуты должны зависеть от всего первичного ключа, а не только от его части.
Частичная зависимость возникает, когда таблица имеет составной первичный ключ, и не все атрибуты зависят от всего ключа.
Здесь первичный ключ — это комбинация "Студент" и "Курс", но атрибут "Преподаватель" зависит только от "Курс". Это нарушает 2NF.
Для приведения таблицы к 2NF нужно разделить её на две таблицы:
Таблица 2: Курсы-Преподаватели
Теперь каждая таблица находится в 2NF: все атрибуты зависят от полного первичного ключа.
Третья нормальная форма (3NF)
Третья нормальная форма требует, чтобы таблица находилась в 2NF и не содержала транзитивных зависимостей. Это значит, что не должно быть зависимостей между неключевыми атрибутами. То есть, если есть зависимость "Атрибут А → Атрибут Б → Атрибут В", то необходимо разделить данные на отдельные таблицы.
Теперь каждая зависимость проходит через первичный ключ, и таблицы находятся в 3NF.
Четвёртая нормальная форма (4NF)
4NF требует, чтобы в таблице не было многозначных зависимостей. Это означает, что один атрибут не должен зависеть от нескольких независимых атрибутов одновременно.
Допустим, у нас есть таблица, которая показывает, какие студенты посещают какие курсы и какие книги они используют для этих курсов:
Здесь "Курс" и "Книга" независимы друг от друга, но оба зависят от студента. Это нарушает 4NF.
Чтобы исправить это, мы разделим таблицу на две:
Теперь зависимости устранены, и таблицы находятся в 4NF.
Пятая нормальная форма (5NF)
5NF решает проблему с так называемыми "разложениями" данных. Она требует, чтобы таблицы были разделены таким образом, чтобы каждая зависимость могла быть восстановлена только через первичный ключ. Это предотвращает избыточность и аномалии при разложении таблиц на более мелкие части.
Рассмотрим таблицу "Проект", которая связывает "Менеджера", "Проект" и "Поставщика". Допустим, у нас есть таблица:
Здесь каждая комбинация менеджера, проекта и поставщика может быть независимой. Для 5NF нужно разделить таблицу на три части:
Преимущества нормализации
- Избегание избыточности — данные не дублируются, что снижает затраты на хранение и предотвращает несогласованность данных.
- Устранение аномалий — нормализованные данные защищены от аномалий при вставке, обновлении и удалении данных.
- Целостность данных — нормализация помогает поддерживать целостность данных, обеспечивая связь между сущностями через первичные и внешние ключи.
- Упрощение запросов — нормализованные базы данных часто проще для выполнения сложных запросов, поскольку данные хорошо структурированы.