JavaRush /Курсы /SQL SELF /Создание ERD (диаграммы сущностей и связей)

Создание ERD (диаграммы сущностей и связей)

SQL SELF
26 уровень , 1 лекция
Открыта

ERD — это сокращение от Entity-Relationship Diagram (диаграмма сущностей и связей). Это визуальное представление структуры вашей базы данных, которое показывает, как сущности (таблицы) связаны друг с другом.

Представьте, что ERD — это карта метрополитена для базы данных. Станции — это таблицы, а линии соединения между ними — это связи. Эта карта помогает вам понять, как перемещаться между станциями (и как таблицы взаимодействуют).

ERD состоит из:

  • Сущностей: это объекты или таблицы, такие как "Студенты", "Курсы", "Преподаватели".
  • Атрибутов: это колонки в таблицах, такие как ID, Имя, Фамилия.
  • Связей: это линии между таблицами, показывающие отношения, например, один студент записан на многие курсы.

С помощью ERD вы можете не только спланировать базу данных, но и показать коллегам или руководству, как она устроена. Это мощный инструмент для любого разработчика!

Основные элементы ERD

  1. Сущности

Сущность — это база данных в миниатюре. Каждая сущность соответствует реальному объекту или понятию, которым вы хотите управлять в своей системе. Например:

  • Таблица "Студенты".
  • Таблица "Курсы".
  • Таблица "Выдачи" (в библиотечной системе).

Пример:


+---------------+
| Студенты      |
+---------------+
| ID            |
| Имя           |
| Фамилия       |
| Дата рождения |
+---------------+
  1. Атрибуты Атрибуты — это отдельные свойства или характеристики сущности. Они отображаются как колонки в таблице базы данных. Например:
  • Для таблицы "Студенты" это могут быть ID, Имя, Фамилия.
  • Для таблицы "Курсы" это ID Курса, Название курса.

В ERD они чаще всего записываются внутри прямоугольника, обозначающего сущность.

Связи между сущностями

Связь показывает, как две сущности взаимодействуют между собой. Напомню основные типы связей:

  • Один-к-одному (1:1): например, каждый студент имеет одно уникальное удостоверение.
  • Один-ко-многим (1:N): например, один преподаватель может вести несколько курсов.
  • Многие-ко-многим (M:N): например, несколько студентов записаны на несколько курсов.

Пример связи "Один-ко-многим":

Студенты (1) <----- записан -----> (N) Курсы

Для реализации связей в базе данных мы обычно используем внешние ключи.

Как построить ERD?

Давайте рассмотрим процесс построения ERD шаг за шагом, а также пример построения для библиотеки.

Шаг 1: Определите сущности

Ваша задача — разбить систему на основные объекты. Например, для системы библиотеки это:

  • "Книги".
  • "Читатели".
  • "Выдачи".

Пример:

+-------------+        +--------------+         +------------+
| Книги       |        | Читатели     |         | Выдачи     |
+-------------+        +--------------+         +------------+
| ID          |        | ID           |         | ID         |
| Название    |        | Имя          |         | Читатель   |
| Автор       |        | Фамилия      |         | Книга      |
| ISBN        |        | Дата Рождения|         | Дата выдачи|
+-------------+        +--------------+         +------------+

Шаг 2: Добавьте атрибуты

Каждая сущность должна иметь ключевые атрибуты. Например:

  • Таблица "Книги" должна включать ID (первичный ключ), Название, Автор, ISBN.
  • Таблица "Читатели" — ID, Имя, Фамилия.

Шаг 3: Установите связи

Теперь добавьте связи между сущностями:

  • "Выдачи" связаны с "Книгами" (одна книга может быть выдана несколько раз).
  • "Выдачи" связаны с "Читателями" (один читатель может брать несколько книг).

Шаг 4: Визуализируйте

Используйте любой инструмент для создания диаграмм, например:

  • draw.io
  • dbdiagram.io
  • Lucidchart
  • Microsoft Visio

Диаграмма будет выглядеть так:

[Читатели] ----(1:N)---- [Выдачи] ----(N:1)---- [Книги]

Для каждой связи добавьте тип данных и пояснение, например:

  • ID Читателя в "Выдачах" связаны с первичным ключом таблицы "Читатели".

Пример: ERD для интернет-магазина

Для интернет-магазина потребуется логическая структура, включающая:

  1. Пользователи (зарегистрированные клиенты).
  2. Продукты (товары).
  3. Заказы.

Шаг 1: Сущности

  • Пользователи: ID Пользователя, Имя, Email.
  • Продукты: ID Продукта, Название, Цена.
  • Заказы: ID Заказа, ID Пользователя, Дата заказа.

Шаг 2: Установление связей

  • Один пользователь может сделать несколько заказов (1:N).
  • Один заказ может включать несколько продуктов (M:N).

Полная диаграмма ERD:

[Пользователи] ----(1:N)---- [Заказы] ----(N:M)---- [Продукты]

Для реализации связи многие-ко-многим добавьте промежуточную таблицу:

  • Состав заказов: ID Заказа, ID Продукта, Количество.

Советы по созданию ERD

  • Сначала подумайте, что вы хотите увидеть в своей базе данных. Всё начинается с понимания вашей предметной области.

  • Включите только те атрибуты и сущности, которые действительно важны. Избыточная детализация может запутать.

  • Убедитесь, что все связи логически обоснованы. Если связь кажется странной, пересмотрите её.

  • Используйте инструменты, которые помогают визуализировать диаграммы. Это сэкономит время и силы.

2
Задача
SQL SELF, 26 уровень, 1 лекция
Недоступна
Приведение таблицы ко второй нормальной форме (2NF)
Приведение таблицы ко второй нормальной форме (2NF)
Комментарии (7)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анатолий Уровень 63
11 февраля 2026
Тут же необходима 4-ая таблица - с жанром отдельно.... В задаче то речь про 3NF.... поэтому жанр надо выделять, чтобы исключить транзитарность
апецт Уровень 44
29 января 2026
Требуемый воркфлоу решения довольно спроный, ведь в реальности на эту таблицу может кто-то ссылаться, и ее дроп может быть неправильно воспринят дочерними таблицами, например, удалением строк, которые ссылались как ON DELETE CASCADE Поэтому лучше использовать ALTER TABLE, например, так

-- Создание таблицы customers
BEGIN;
DROP TABLE IF EXISTS customers;

CREATE TABLE customers (
    customer_id SERIAL PRIMARY KEY,
    customer_name TEXT NOT NULL,
    customer_phone TEXT NOT NULL,
    UNIQUE (customer_name, customer_phone)
);

-- Вставка уникальных клиентов в таблицу customers
INSERT INTO customers (customer_name, customer_phone)
SELECT customer_name, customer_phone
FROM orders
ON CONFLICT DO NOTHING;

-- Добавление в orders столбца customer_id и ограничения на него
ALTER TABLE orders
ADD COLUMN customer_id INT;
ALTER TABLE orders
ADD CONSTRAINT orders_fk_cid
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id) DEFERRABLE INITIALLY DEFERRED; -- Ограничение отложено, чтобы избежать ошибки из-за пустых значений при инициализации

UPDATE orders o
SET customer_id = c.customer_id
FROM customers c
WHERE o.customer_phone = c.customer_phone AND
      o.customer_name = c.customer_name;

SET CONSTRAINTS orders_fk_cid IMMEDIATE; -- Необходимо выполнить проверку ограничений, чтобы изменение таблицы не вызвало ошибки

ALTER TABLE orders
    DROP COLUMN customer_name;
ALTER TABLE orders
DROP COLUMN customer_phone;

SELECT *
FROM customers;

SELECT *
FROM orders;

COMMIT;
Валидацию это, конечно, не проходит, но выглядит как минимум правильнее
Slevin Уровень 59
18 сентября 2025
Душненький валидатор однако...
Евгений Уровень 56 Expert
26 августа 2025
Рекомендую использовать. Простая и удобная программка в онлайне, но учитывайте, что она довольно ограниченная, хотя ERD в ней построить можно 🙃
Slevin Уровень 59
18 сентября 2025
.... А где...?
Евгений Уровень 56 Expert
18 сентября 2025
Почистили ссылку походу. drawio, запускается прямо в браузере.
Slevin Уровень 59
19 сентября 2025
Они же сами его рекомендуют дальше в лекциях! Зачем удалили...