Атрибуты сущности в ER-модели: пять типов и примеры
Атрибут сущности в ER-модели - это именованное свойство объекта предметной области, значение которого хранится в базе данных: у сущности «Сотрудник» это, например, имя, адрес или номер телефона. От того, как именно классифицирован атрибут - простой он, составной, ключевой, многозначный или производный, - напрямую зависит, во сколько столбцов и таблиц он превратится при переходе от ER-диаграммы к реляционной схеме. Ниже разберём все пять типов по очереди, на примерах и с формулами перехода к столбцам. Чтобы сразу увидеть, как атрибуты растекаются по таблицам, покрутите калькулятор ниже: он показывает Sankey-диаграмму маршрутизации атрибутов и сравнение числа строк в главной и дочерней таблице.
Что такое атрибут в ER-модели
В терминах ER-модели (Entity-Relationship, «сущность-связь») сущность - это класс объектов предметной области («Сотрудник», «Студент», «Заказ»), а атрибут - характеристика этой сущности, значение которой берётся из некоторого домена (множества допустимых значений). У атрибута «Возраст» домен - целые неотрицательные числа, у атрибута «Пол» - конечный набор значений. На диаграмме атрибут традиционно рисуют овалом, соединённым линией с прямоугольником сущности; текст внутри овала - имя атрибута.
Не любое свойство объекта стоит выносить в атрибут: если свойство многократно используется в бизнес-логике, слабо связано с сущностью или само содержит вложенные сущности со своими атрибутами и связями, вероятно, речь о самостоятельной сущности или связи, а не об атрибуте. Но если свойство - это одно значение (или чётко определённый набор значений), принадлежащее ровно одному экземпляру сущности, перед вами атрибут, и дальше вопрос только в том, к какому из пяти типов он относится.
Пять типов атрибутов: обозначения на диаграмме
Классическая классификация атрибутов сущности в ER-модели различает пять типов, и каждый на диаграмме обозначается своим начертанием овала:
- Простой (атомарный) атрибут - значение неделимо на бизнес-уровне: номер группы, должность. Обычный овал.
- Составной атрибут - распадается на несколько компонентов, каждый из которых сам является атрибутом: «Адрес» = город + улица + дом. На диаграмме от составного овала отходят дочерние овалы простых частей.
- Ключевой атрибут - однозначно идентифицирует экземпляр сущности: табельный номер, номер зачётки. Имя атрибута подчёркивают.
- Многозначный атрибут - у одного экземпляра сущности может быть несколько значений одновременно: «Телефоны», «Языки владения». Изображается двойным овалом.
- Производный атрибут - не хранится, а вычисляется по другим атрибутам: «Возраст» выводится из «Даты рождения». Изображается пунктирным овалом.

Эти пять обозначений - не формальность: тип атрибута прямо определяет, как СУБД физически хранит его значения, и об этом дальше.
Составной атрибут и его части
Составной атрибут удобен для человека - «Адрес» читается как единое целое, - но при проектировании базы данных он либо раскладывается на части ещё на этапе ER-модели, либо хранится текстом одной строкой (что почти всегда неудобно для поиска и сортировки). Каноничный пример - «Адрес», распадающийся на «Город», «Улицу» и «Дом»; при необходимости добавляют «Индекс» и «Квартиру».
Ключевое практическое правило: при переходе к реляционной таблице составной атрибут с частями превращается ровно в отдельных столбцов главной таблицы - сам «зонтичный» атрибут (например, «Адрес» целиком) отдельного столбца не получает, он существует только на уровне ER-диаграммы как группировка родственных простых атрибутов.

Многозначный атрибут и отдельная таблица
Многозначный атрибут - самый частый источник ошибок в учебных задачах, потому что интуитивно хочется завести несколько столбцов вроде «Телефон1», «Телефон2», «Телефон3». Так делать нельзя: заранее неизвестно, сколько значений будет у конкретного экземпляра, а фиксированное число столбцов либо режет данные (если телефонов больше), либо оставляет пустые столбцы (если меньше) - оба варианта нарушают первую нормальную форму.
Правильное решение - вынести многозначный атрибут в отдельную таблицу с внешним ключом на исходную сущность: таблица «Телефоны» получает столбцы «id_сотрудника» (внешний ключ) и «телефон», а строк в ней столько, сколько всего телефонов у всех сотрудников. Если у сущности экземпляров, а в среднем значений многозначного атрибута на экземпляр, то число строк дочерней таблицы равно - растёт не число столбцов, а число строк.
Производный атрибут: не храним, а вычисляем
Производный атрибут связан зависимостью с одним или несколькими другими атрибутами той же (или связанной) сущности и в норме вообще не хранится физически - его значение получают вычислением в момент запроса. Классический пример - «Возраст», который выводится из «Даты рождения»:
Если хранить «Возраст» как обычный простой атрибут, значение придётся ежедневно (а формально - ежесекундно) пересчитывать и обновлять во всех строках, иначе база данных начнёт врать уже назавтра после последнего обновления. Производный атрибут решает эту проблему тем, что вообще не занимает места в таблице: на диаграмме он всё ещё присутствует (пунктирным овалом, для полноты модели предметной области), но при генерации схемы ему не сопоставляют столбец - вместо этого пишут вычисляемое выражение или представление (view).
Как атрибуты сущности превращаются в таблицы и колонки БД
Собирая всё вместе, переход от набора атрибутов сущности к реляционной схеме подчиняется простым правилам:
- Ключевой атрибут → один столбец главной таблицы, обычно первичный ключ.
- Каждый простой (не ключевой) атрибут → один столбец главной таблицы.
- Составной атрибут из частей → столбцов главной таблицы (сам составной атрибут - не столбец).
- Каждый многозначный атрибут → отдельная таблица с внешним ключом и столбцом значения; строк в ней .
- Производный атрибут → ни одного столбца; вычисляется запросом или представлением.
Если у сущности простых атрибутов (без ключа) и составной атрибут с частями, число столбцов главной таблицы:
Пример: сущность «Сотрудник» с полным набором атрибутов
Возьмём сущность «Сотрудник» с ключевым атрибутом «Табельный номер», двумя простыми атрибутами «Имя» и «Фамилия» (), составным атрибутом «Адрес» из трёх частей - «Город», «Улица», «Дом» (), многозначным атрибутом «Телефоны» (в среднем телефона на сотрудника) и производным атрибутом «Возраст» (из «Даты рождения»). При сотрудниках получаем:
То есть таблица «Сотрудники» получит 6 столбцов (табельный номер, имя, фамилия, город, улица, дом), а связанная таблица «Телефоны» - 2 столбца (id_сотрудника, телефон) и 300 строк. «Возраст» нигде не хранится - его выводит запрос из «Даты рождения» при каждом обращении. Именно эту схему и считает калькулятор выше: подвиньте ползунки , , и , чтобы увидеть, как меняются число столбцов и число строк для вашей сущности.
Частые ошибки
- Хранить многозначный атрибут как несколько пронумерованных столбцов («Телефон1», «Телефон2»). Правильно - отдельная таблица с внешним ключом, число строк которой .
- Считать составной атрибут отдельным столбцом. У составного атрибута нет своего столбца - столбцами становятся только его части, число которых равно .
- Хранить производный атрибут как обычный простой. Это дублирует данные и рассинхронизируется при изменении первичного атрибута («Дата рождения» изменилась - «Возраст» остался старым).
- Забывать подчеркнуть ключевой атрибут на диаграмме или указывать в качестве ключа составной либо многозначный атрибут - ключ должен однозначно идентифицировать экземпляр и не должен сам требовать разложения.
- Путать домен атрибута с его типом на диаграмме. Домен (множество допустимых значений, например, целые числа от 18 до 100) - это ограничение на значения простого атрибута, а не отдельный тип атрибута.
FAQ
Сколько типов атрибутов существует в ER-модели? Пять: простой (атомарный), составной, ключевой, многозначный и производный. Иногда ключевой атрибут выделяют не как отдельный тип, а как свойство простого или составного атрибута - но для учебных задач удобнее считать все пять типов равноправными категориями.
Может ли атрибут быть одновременно составным и многозначным? Да: например, «Образование» может включать несколько записей, каждая из которых сама составная (учебное заведение, год, специальность). Такой атрибут при переходе к реляционной схеме превращается в отдельную таблицу, где каждая часть составной структуры - свой столбец, а строк столько, сколько записей у конкретного экземпляра сущности.
Почему многозначный атрибут не хранят в самой сущности? Потому что число значений заранее неизвестно и может отличаться от экземпляра к экземпляру. Фиксированное число столбцов либо не вместит все значения, либо оставит пустые ячейки - оба варианта нарушают первую нормальную форму реляционной модели.
Коротко
Атрибут сущности в ER-модели бывает пяти типов: простой, составной, ключевой, многозначный и производный, и каждый по-своему превращается в реляционную схему. Ключевой и простые атрибуты дают по одному столбцу главной таблицы, составной с частями - столбцов, многозначный с значениями на экземпляров сущности уходит в отдельную таблицу из строк, а производный атрибут вообще не хранится и вычисляется запросом. Держа в голове эти пять правил перехода, легко и классифицировать атрибуты на ER-диаграмме, и спроектировать по ней корректную реляционную схему.
Читайте также

Агрегатные функции SQL: COUNT, SUM, AVG и GROUP BY
Как работают агрегатные функции SQL: COUNT, SUM, AVG, MIN и MAX, группировка GROUP BY, порядок выполнения запроса, разница HAVING и WHERE и поведение NULL внутри агрегата.

SQL соединения таблиц: типы JOIN и число строк
Разбираем соединение таблиц в SQL на строках: условие ON, отличие INNER JOIN от LEFT, RIGHT и FULL, откуда берутся NULL и почему фильтр в WHERE ломает внешнее соединение.

Функциональная зависимость в базе данных: разбор
Функциональная зависимость в базе данных простыми словами: запись X → Y, виды зависимостей, аксиомы Армстронга, замыкание атрибутов и роль ФЗ в нормализации и поиске ключей.

Хранимые процедуры в базе данных: зачем нужны и как писать
Хранимые процедуры в базе данных простыми словами: что это, синтаксис CREATE PROCEDURE, параметры IN OUT, отличие от функций и триггеров, плюсы и минусы, примеры на SQL.

Нормальная форма Бойса-Кодда (БКНФ): детерминант суперключ
Нормальная форма Бойса-Кодда БКНФ простыми словами: чем БКНФ строже 3НФ, как проверить, что детерминант каждой зависимости является суперключом, и как декомпозировать таблицу до БКНФ.

Третья нормальная форма (3НФ): транзитивные зависимости
Третья нормальная форма 3НФ простыми словами: чем 3НФ отличается от 2НФ, как найти транзитивную зависимость неключевого атрибута и разбить таблицу, чтобы убрать аномалии обновления.