Элементы уровней ER-моделей
Теперь определим, какие элементы включает в себя каждый из уровней ER-модели.
Концептуальный уровень
Концептуальная модель данных (Conceptual Data Model) — это описание важных для предметной области понятий и связей между ними.
Концептуальная ER-модель не зависит от конкретной системы управления базами данных (СУБД). Её можно применять для создания словаря, описывающего бизнес-информацию и связи внутри этой информации.
Концептуальная ER-модель — это представление самого высокого уровня абстракции. Она содержит наименьшее количество деталей и отражает общий объём модели, то есть количество сущностей и связей в ней.
Рассмотрим на примере. Предположим, вы хотите сделать смузи. Его можно приготовить практически из любых фруктов и овощей. Но вы предпочитаете зелёный смузи, и для него потребуется несколько яблок и одно киви.
Предметная область в этом примере — приготовление зелёного смузи, а понятия, которые мы включили в описание концептуальной модели, — «яблоко», «киви», «смузи». Связи между ними мы выделили курсивом: для приготовления одного зелёного смузи потребуется несколько яблок и одно киви.
Концептуальный уровень — как правило, первый этап в составлении ER-модели, но в небольших системах, если у них простая и понятная структура (мало сущностей и связей), создавать ER-модель можно и с логического уровня.
Логический уровень
Логическая модель данных (Logical Data Model) — это описание важных для предметной области понятий, их атрибутов и связей между понятиями.
Логическая модель данных тоже не зависит от конкретной СУБД. В логической ER-модели, кроме сущностей и связей между ними, системный аналитик определяет основные атрибуты, а также первичные ключи. Следовательно, логическая модель содержит больше деталей, чем концептуальная.
Рассмотрим понятие «яблоко». Рецепт зелёного смузи, например, требует, чтобы мы использовали свежие, сладкие яблоки среднего размера. Это значит, что атрибутами (характеристиками) сущности «яблоко» для этого примера могут быть «дата сбора урожая», «вкус», «размер».
Набор атрибутов и их качественный состав отличают одно понятие от другого. Качественный состав — это то, как мы определяем характеристику. Если рассматривать атрибут «размер», мы можем подразумевать высоту, ширину или просто слово «большой». Каждый атрибут должен быть задействован хотя бы в одном из процессов.
Рассматривая понятие «киви», мы заметим, что атрибуты для двух сущностей («яблоко» и «киви») совпадают, ведь киви тоже должно быть свежим, сладким и средним по размеру. В этом случае мы можем обобщить понятия «яблоко» и «киви»: и то и другое — «ингредиент». Таким образом, после выделения характеристик на логическом уровне изменилось количество сущностей: две сущности («яблоко» и «киви») превратились в одну.
Мы уже знаем, что для приготовления одного смузи требуется несколько ингредиентов (яблоки и киви). Предположим, что один ингредиент можно использовать для приготовления только одного смузи, тогда сущность «смузи» становится родительской по отношению к сущности «ингредиент».
Атрибуты «уникальный номер ингредиента» и «уникальный номер приготовленного смузи» (в нашем примере это порядковые номера) будут первичными ключами для сущностей «ингредиент» и «смузи», соответственно.
Логическая модель необходима для описания атрибутов сущностей, определения первичных ключей и уточнения числа сущностей — всё это подготовительные действия перед составлением физической модели, которая ляжет в основу будущей базы данных.
Физический уровень
Физическая ER-модель — это описание того, как логическая ER-модель может быть разработана с помощью определённой технологии. Например, мы составляем разные физические ER-модели для разных реляционных СУБД (PostgreSQL, Oracle Database, MS SQL и других). То есть одной логической ER-модели могут соответствовать несколько физических ER-моделей.
Для построения физической ER-модели сущности в будущей базе данных должны рассматриваться как таблицы. Для каждой таблицы нужно определить имя на английском языке.
Атрибуты сущностей в будущей базе данных должны рассматриваться как поля таблиц. Для каждого поля нужно определить:
- Имя на английском языке.
- Тип данных и размерность.
- Допустимость пустых значений.
- Значение по умолчанию (если требуется).
- Правила валидации значений (если требуется).
Связи между таблицами нужно отражать через внешний ключ.
Вернёмся к смузи. В физической модели данных этой сущности будет соответствовать таблица smoothie. В ней мы будем хранить экземпляры сущности «смузи», то есть строки, соответствующие каждому приготовленному напитку. Полями таблицы smoothie могут быть столбцы id (уникальный номер), created_at (день приготовления) и volume (объём). Для каждого поля мы должны определить тип данных, например: id — числа, created_at — текст, volume — текст.
Ещё нам нужно определить, какие поля можно оставить пустыми, какие — нет, нужно ли для некоторых полей устанавливать значения по умолчанию и по каким принципам валидировать значения (система выдаст ошибку, если значения не будут удовлетворять определённым требованиям): например, мы можем установить правило, что объём напитка не может быть меньше 100 мл.