Анализ предметной области: сущности и свойства

Инфологический (концептуальный) анализ предметной области

Инфологический анализ — фундамент создания надежной базы данных. Задача разработчика — перевести слабоструктурированное описание реального мира в формальную математическую модель.

Этап 1

Сбор требований

Интервьюирование предметных экспертов, аудит бланков, отчетов и бизнес-правил предприятия.

Этап 2

Семантическая модель

Выделение независимых сущностей, их качественных и количественных характеристик (атрибутов).

Этап 3

Независимость от СУБД

Инфологическая схема инвариантна к конкретной СУБД (PostgreSQL, Oracle, MySQL, SQLite).

Цена проектной ошибки: Архитектурная ошибка на инфологическом этапе обходится в 30 раз дороже, чем синтаксическая ошибка при написании SQL-запроса.

Понятие сущности (Entity Type)

Сущность (Entity) — абстрактная категория или класс однотипных объектов реального мира, информация о которых представляет интерес для предметной области.

Материальные сущности

Физически осязаемые объекты реального мира:

  • Автомобиль (тягач, прицеп, легковой фургон);
  • Сотрудник (водитель, менеджер, инженер);
  • Запчасть (тормозные колодки, фильтр).

Нематериальные и процессные сущности

События, договоры, факты взаимодействия:

  • Путевой лист (факт выполнения рейса);
  • Бронирование (резервирование номера отеля);
  • Заказ на ремонт (договор на оказание услуг).

Экземпляр сущности (Entity Instance / Tuple)

Разграничение сущности и экземпляра — базовое правило инфологического анализа.

Сущность (Чертеж / Метаданные)

Определяет схему и набор допустимых характеристик.

ENTITY Студент (Номер_билета, ФИО, Группа, Дата_поступления)

В реляционной СУБД сущности соответствует таблица (Relation).

Экземпляр (Конкретный объект)

Конкретное индивидуальное воплощение сущности с реальными значениями.

('Б-10492', 'Иванов Иван Иванович', 'СИС-25', '2025-09-01')

В реляционной СУБД экземпляру соответствует строка таблицы (Кортеж / Tuple).

Система классификации атрибутов

Атрибут — поименованное элементарное свойство сущности. Атрибуты классифицируются по трем независимым ортогональным осям:

Ось 1

Структура

Простые (атомарные) vs Составные (декомпозируемые).

Делимо ли свойство на независимые смысловые части?

Ось 2

Кардинальность

Однозначные vs Многозначные.

Сколько значений может принимать свойство у одного экземпляра?

Ось 3

Происхождение

Базовые (хранимые) vs Производные (вычисляемые).

Вводится ли значение извне или рассчитывается по формуле?

Простые (атомарные) и составные атрибуты

Простой атрибут

Не содержит составных частей, атомарен в контексте решаемой задачи:

  • Оклад (число 75000.00);
  • Объем_двигателя (2.4 л);
  • Дата_рождения.

Составной атрибут

Может быть декомпозирован на независимые компоненты:

  • ФИО → Фамилия, Имя, Отчество;
  • Адрес → Индекс, Город, Улица, Номер дома;
  • Паспорт → Серия, Номер, Кем выдан, Дата.
Требование 1НФ: Для реализации быстрого поиска и сортировки составные атрибуты в реляционных БД всегда декомпозируются на отдельные атомарные столбцы!

Однозначные и многозначные атрибуты

Однозначный атрибут

Имеет строго одно значение для конкретного экземпляра:

  • ИНН организации;
  • VIN-код автомобиля;
  • Дата фактической выдачи заказа.

Многозначный атрибут

Может содержать список/набор значений:

  • Авторы у книги (от 1 до 10 соавторов);
  • Контактные телефоны у клиента;
  • Категории водительских прав (B, C, CE).
Фатальная ошибка новичка: Хранить многозначные значения через запятую в одной текстовой строке («Иванов, Петров, Сидоров»). Правило: многозначный атрибут выносится в отдельную связанную сущность!

Базовые (хранимые) и производные атрибуты

Базовый атрибут

Физически записывается на накопитель:

  • Дата_заезда и Дата_выезда;
  • Суточный_тариф отеля;
  • Показания_одометра при выезде и возврате.

Производный атрибут

Вычисляется по формуле на лету:

  • Количество_дней = Дата_выезда - Дата_заезда;
  • Итого = Дней * Суточный_тариф;
  • Пробег_за_рейс = Одометр_возврат - Одометр_выезд.
Инженерный принцип непротиворечивости: Производные поля не хранятся физически в таблице (во избежание рассинхронизации при обновлении базовых полей), а вычисляются в SQL-запросах или виртуальных столбцах (GENERATED ALWAYS AS).

Понятие домена атрибута (Attribute Domain)

Домен — математически строгое множество всех допустимых значений атрибута в предметной области.

Технический тип данных SQL

Определяет только машинное представление битов:

INT (от -2 147 483 648 до +2 147 483 647)

Машина примет число -500 как корректный возраст.

Смысловой домен предметной области

Ограничивает значения законами реального мира:

Domain_Age = { x ∈ Integer | 0 ≤ x ≤ 125 }

Защищает базу от абсурдных и некорректных данных.

Спецификация ограничений домена

При концептуальном проектировании для каждого атрибута фиксируется 5 параметров домена:

1. Тип и длина

Символьный (VARCHAR), точный числовой (DECIMAL), дата (DATE).

2. Диапазон (Range)

CHECK (Оценка BETWEEN 2 AND 5)

3. Шаблон и маска

Регулярные выражения: телефон, e-mail, VIN, госномер.

4. Перечисление (ENUM)

Статусы заказа: 'Принят', 'В работе', 'Готов', 'Выдан'.

5. Определенность

NOT NULL (обязательно) или NULL (неизвестно).

Бизнес-правило

Проверка дат: Дата_выезда > Дата_заезда.

Потенциальные ключи (Candidate Keys)

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

Свойство 1: Уникальность

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

Свойство 2: Неизбыточность (Минимальность)

Если из ключа убрать хотя бы одно поле, он потеряет свойство уникальности.

Пара (Паспорт + Фамилия) уникальна, но избыточна, так как Паспорт уже уникален сам по себе.

Выбор первичного ключа (Primary Key)

Из множества потенциальных ключей проектировщик выбирает один в качестве первичного (PK). Остальные становятся альтернативными (AK).

1. Краткость

Предпочтение отдается компактным числовым типам данных (4-8 байт) для ускорения B-Tree индексов.

2. Неизменяемость

Значение первичного ключа не должно изменяться на протяжении всей жизни объекта.

3. Простота связей

Первичный ключ мигрирует в дочерние таблицы как внешний ключ (Foreign Key).

Естественные vs Суррогатные ключи

Естественный ключ (Natural Key)

Идентификатор из реального мира (VIN авто, паспорт, ISBN книги):

  • Понятен человеку без обращений к таблицам;
  • Минус: Длинные строки замедляют JOIN и индексы;
  • Риск: Замена паспорта или ошибка оператора требует каскадного обновления всей БД.

Суррогатный ключ (Surrogate Key)

Искусственный системный код (ID INT AUTO_INCREMENT):

  • Компактен (4-8 байт), идеален для внешних ключей;
  • Абсолютно стабилен во времени;
  • Не зависит от смены регламентов и документов.
Золотой стандарт: Суррогатный ID делаем Primary Key, а естественный код защищаем ограничением UNIQUE!

Карта типовых ошибок начинающего разработчика

1. Смешение класса и объекта

Создание отдельных сущностей «КамАЗ» и «Газель» вместо единой сущности «Автомобиль» со свойством «Модель».

2. Превращение свойства в таблицу

Создание отдельной пустой таблицы ради единственного поля «Цвет» без собственных характеристик.

3. Дублирование производных данных

Физическое хранение «Суммы» рядом с «Ценой» и «Количеством», приводящее к расхождению расчетов.

4. Составной ключ из ПДн

Использование паспортных данных в качестве первичного ключа во внешних связях.

Главное правило: строго валидируйте домены атрибутов!

Культовый комикс-мем xkcd #327: Exploits of a Mom (Little Bobby Tables) — школа потеряла данные из-за невалидированного ввода имени Robert'); DROP TABLE Students;--
Комикс-стрип: xkcd #327 — «Exploits of a Mom» («Little Bobby Tables») • Автор: Randall Munroe (xkcd.com) • Лицензия: Creative Commons Attribution-NonCommercial 2.5 (CC BY-NC 2.5) • Мораль: Домен атрибута «ФИО» — текст, а не исполняемый SQL-скрипт! Санитизируйте входные данные!