Перейти к основному содержимому

Концептуальные схемы и информационные модели

Архитектору Аналитику

Информационная модель — описание того, какие сущности, атрибуты и связи нужны системе, чтобы отражать предметную область. Концептуальная схема — верхний уровень такой модели: что существует в мире задачи, без деталей СУБД, индексов и форматов файлов.

Маршрут в разделе Мыслительная база:

Материал перекликается со статьями Концептуальная схема и Информационная модель в Википедии. Рядом по смыслу — реляционная алгебра и множества и отношения. Контекст моделей — Системы и модели.


Термины главы — в словаре.

Концепция и таблицы — разные уровни​

Если сразу рисовать таблицы, команда может не согласовать смысл с бизнесом. Типичный симптом — поле status с десятком несовместимых трактовок в отчётах.

Аналогия. Концептуальная схема — карта города с районами и дорогами. Логическая схема — план зданий с этажами и комнатами. Физическая схема — как построен фундамент и где стоят лифты. Строить фундамент без карты можно, но риск перепутать улицы высок.

Рекомендуемый порядок:

  1. согласовать концепцию с владельцем продукта;
  2. спроектировать логическую модель под SQL или другую модель данных;
  3. оптимизировать физический уровень под нагрузку.

Ввод по хранению — Основы баз данных. Смысл полей — Семантика.


Три уровня схемы данных​

Классическое разделение восходит к стандарту ANSI/SPARC (трёхуровневая архитектура) и на высоком уровне согласуется с framework Zachman — матрицей вопросов "что / как / где" для предприятия.

УровеньГлавный вопросЧто игнорируем намеренноТипичный артефакт
КонцептуальныйО чём говорим?движок БД, язык программированияER-диаграмма, domain model, глоссарий
ЛогическийКак хранить в выбранной модели данных?конкретный сервер, дискDDL, ER→таблицы, JSON Schema
ФизическийКак быстро и надёжно на носителе?чистота доменной терминологиииндексы, шардирование, сжатие, реплики

Концептуальный уровень — подробнее​

Фиксируют понятия предметной области:

  • сущности (Заказ, Товар, Покупатель);
  • атрибуты (дата, сумма);
  • связи (оформляет, содержит);
  • бизнес-правила на естественном языке ("заказ нельзя удалить после оплаты").

Не фиксируют:

  • VARCHAR(255);
  • UUID или auto-increment;
  • названия индексов.

Аудитория — аналитик, продакт, архитектор, эксперт домена. Артефакт должен быть понятен без знания SQL.

Логический уровень — подробнее​

Выбирают модель данных:

  • реляционные таблицы;
  • документы JSON;
  • графовые узлы и рёбра;
  • колоночные семейства.

На этом уровне появляются:

  • первичные и внешние ключи;
  • типы столбцов;
  • уникальные ограничения;
  • нормализация — устранение избыточности.

Логическая схема всё ещё переносима между PostgreSQL и MySQL, хотя детали типов могут отличаться.

Физический уровень — подробнее​

Оптимизация под конкретную СУБД и железо:

  • B-tree и GIN-индексы;
  • партиционирование по дате;
  • реплики чтения;
  • сжатие страниц;
  • размещение на SSD или object storage.

Изменения на физическом уровне не должны менять смысл концептуальной модели. Если меняется смысл — это ревизия концепции.

Три уровня и несколько сервисов​

В микросервисной архитектуре у каждого сервиса своя логическая и физическая схема, но концептуальный глоссарий предприятия один.

Концепция (общая): Customer, Order, Product
Сервис заказов: таблицы orders, line_items
Сервис каталога: таблицы products, categories
Сервис клиентов: таблицы parties, contacts

Согласование — через интеграции и онтологию, а не через общую БД.


Концептуальная схема как карта домена​

В глоссарии концептуальная схема определена как семантическая сеть понятий с правилами связи — карта всей предметной области.

СУЩНОСТЬ "Заказ"
атрибуты
— номер
— дата
— сумма
связи
— оформлен Покупателем (один к одному)
— содержит СтрокиЗаказа (один ко многим)
— имеет Статус из справочника

СУЩНОСТЬ "Покупатель"
специализация: ФизЛицо | ЮрЛицо

Такую схему обсуждают с аналитиком и владельцем продукта до выбора VARCHAR(255) и движка БД.

Правила на концептуальном уровне​

Тип правилаПример
Структурноеу заказа минимум одна строка
Инвариантсумма заказа неотрицательна
Жизненный циклиз "черновик" можно в "оплачен", из "отменён" — нельзя
Идентификацияномер заказа уникален в пределах компании

Правила потом переносят в код, ограничения SQL и контракты API. Представление знаний позволяет часть правил записать явно для вывода.


ER-модель — пошаговое построение​

ER-модель (Entity-Relationship — "сущность–связь", Питер Чен, 1976) — распространённый язык концептуального проектирования.

Шаг 1. Собрать существительные из требований​

Из user story "покупатель оформляет заказ с несколькими товарами":

  • Покупатель
  • Заказ
  • Товар
  • (неявно) Строка заказа

Шаг 2. Отфильтровать атрибуты и сущности​

КандидатСущность или атрибут?
email покупателяатрибут сущности Покупатель
дата заказаатрибут Заказ
количество в позицииатрибут СтрокаЗаказа
"срочный"атрибут или тип заказа — уточнить с бизнесом

Если у объекта собственная идентичность и на него ссылаются — это сущность. Если описывает другое — атрибут.

Шаг 3. Нарисовать сущности (прямоугольники)​

┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Покупатель │ │ Заказ │ │ Товар │
└─────────────┘ └─────────────┘ └─────────────┘

Шаг 4. Добавить атрибуты (овалы или список внутри прямоугольника)​

В нотации Chen — овалы. В практике чаще список внутри блока:

Покупатель: имя, email, тип (физ/юр)
Заказ: номер, дата, сумма
Товар: артикул, название, цена
СтрокаЗаказа: количество, цена_за_единицу

Шаг 5. Связи (ромбы или подписи на линиях)​

Покупатель —[оформляет]— Заказ
Заказ —[содержит]— СтрокаЗаказа
Товар —[входит в]— СтрокаЗаказа

Шаг 6. Кардинальности (см. следующий раздел)​

Шаг 7. Проверить сценариями​

Прогнать три реальных кейса из бизнеса. Если диаграмма не позволяет описать кейс — вернуться к шагу 1.

Элементы ER в таблице​

ЭлементНа диаграмме ChenСмысл
Сущностьпрямоугольникобъект домена (Заказ, Товар)
Атрибутовалсвойство сущности (дата, сумма)
Связьромботношение между сущностями
Кардинальность1:1, 1:N, M:Nсколько экземпляров с каждой стороны
Слабая сущностьдвойной контуридентификатор зависит от родителя (СтрокаЗаказа без Заказа не существует)

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

Кардинальность отвечает на вопрос "сколько экземпляров B допустимо для одного A".

ОбозначениеЧитаетсяПример
1:1один к одномуПаспорт — Владелец
1:N (1:M)один ко многимЗаказ — СтрокиЗаказа
M:Nмногие ко многимСтудент — Курс (без промежуточной сущности)

Минимальная и максимальная кратность​

Часто уточняют обязательность:

Заказ (1,1) —— (0,*) СтрокаЗаказа
у каждого заказа от нуля строк? → бизнес сказал "минимум 1" → (1,*)

Запись (min, max):

СвязьminmaxСмысл
Заказ — Покупатель11у заказа ровно один покупатель
Заказ — Строка1*минимум одна строка
Товар — Отзыв0*отзывов может не быть

Связь многие-ко-многим и промежуточная сущность​

Связь многие-ко-многим на логическом уровне раскладывают через ассоциативную сущность.

Студент M:N Курс → ЗаписьНаКурс (student_id, course_id, grade)
Товар M:N Заказ → СтрокаЗаказа (order_id, product_id, qty, price)

Таблица строка_заказа связывает заказ и товар и хранит собственные атрибуты связи (количество, цена за единицу).

Идентифицирующая связь​

Если дочерняя сущность не существует без родителя, ключ строки включает ключ заказа:

СтрокаЗаказа: (order_id, line_no) — составной первичный ключ

На концептуальном уровне это "слабая сущность"; на логическом — составной PK или суррогатный id плюс FK.


UML и ER в одной задаче​

Диаграмма классов UML (Unified Modeling Language — унифицированный язык моделирования) на этапе анализа часто играет роль концептуальной модели.

КритерийER (Chen / crow's foot)UML class diagram
Фокусданные и связиструктура + при необходимости поведение
Нотация связейромб, кратность 1:Nассоциация, агрегация, композиция
Аудиторияаналитики БД, архитекторы данныхразработчики ООП
Наследованиеспециализация сущностейобобщение с подклассами
Типичный выходтаблицы SQLклассы Java, C#, Kotlin

ER нагляднее, когда моделируют только данные и отчётность. UML привычнее, если модель тянут в код на Java или C#.

Агрегация и композиция в UML​

СвязьСмыслПример
Ассоциацияобщая связьПокупатель оформляет Заказ
Агрегация (пустой ромб)целое и части, части могут жить отдельноОтдел и Сотрудники
Композиция (закрашенный ромб)части не существуют без целогоЗаказ и СтрокиЗаказа

На ER это обычно выражают обязательностью и идентифицирующей связью.

Когда использовать оба​

  • ER на воркшопе с бизнесом;
  • UML в репозитории рядом с кодом;
  • явная таблица соответствия "сущность ER → класс UML → таблица SQL".

Domain model в DDD​

Domain model в DDD (Domain-Driven Design — проектирование, управляемое предметной областью) — концептуальная модель ядра продукта в коде и в языке команды.

Принципы:

  • Ubiquitous language — те же слова в диаграмме, в коде и в разговоре с бизнесом;
  • Bounded context — внутри контекста модель цельна; между контекстами — явные переводы терминов;
  • Агрегат — кластер сущностей с корнем (например Order + LineItem) и границей транзакции.
Контекст "Продажи"
Aggregate Order
- OrderId
- CustomerId (ссылка на контекст CRM)
- Lines[]
- метод Submit(), Pay()

Контекст "Каталог"
Aggregate Product
- SKU, title, price

Концептуальная схема на доске и domain model в коде должны совпадать по терминам. Расхождение порождает баги на границе слоёв. Связь с онтологией — онтология может охватывать несколько bounded context и задавать глобальные определения.


Модель предприятия​

На уровне всей организации информационная модель шире одной базы.

Что входит:

  • потоки между CRM, ERP, складом;
  • мастер-данные (MDM — Master Data Management, эталонные справочники клиентов и товаров);
  • границы микросервисов;
  • роли владельцев данных (data steward).

Связанные подходы:

  • CIM (Common Information Model) — унификация описания инфраструктуры;
  • диаграммы C4 и контекста — проектирование и архитектура;
  • контракты API — продолжение модели на границе сервиса;
  • ArchiMate — слои бизнес / приложение / технология.

Концептуальная схема одного сервиса должна вписываться в общий глоссарий терминов предприятия. Иначе "клиент" в CRM и "клиент" в биллинге останутся разными сущностями.

Кейс — розничная сеть​

  • Центральный MDM хранит Product и Store.
  • Интернет-магазин добавляет WebCategory и Promotion.
  • Касса POS знает ReceiptLine, но не дублирует название товара — тянет из MDM по SKU.

Концептуальная схема на уровне предприятия показывает Product один раз; сервисные схемы — только расширения.


От концепции к таблицам SQL​

Типичная последовательность маппинга ER → реляционная модель:

  1. Сущность → таблица (orders, customers, products).
  2. Атрибут → столбец с типом (created_at TIMESTAMPTZ, total NUMERIC(12,2)).
  3. 1:N → внешний ключ на стороне "многих" (line_items.order_id → orders.id).
  4. M:N → промежуточная таблица (line_items для заказ–товар).
  5. 1:1 → FK с UNIQUE или общий PK.
  6. Справочник → отдельная таблица + FK (order_status_id).

Псевдокод маппинга​

ДЛЯ КАЖДОЙ сущности E
СОЗДАТЬ таблицу E_plural
ДОБАВИТЬ суррогатный ключ id ИЛИ естественный ключ из атрибутов

ДЛЯ КАЖДОЙ связи 1:N от A к B
ДОБАВИТЬ в таблицу B столбец a_id NOT NULL REFERENCES A(id)

ДЛЯ КАЖДОЙ связи M:N между A и B
СОЗДАТЬ таблицу A_B с (a_id, b_id) и атрибутами связи

ДЛЯ подтипов (ФизЛицо / ЮрЛицо)
ВАРИАНТ 1: одна таблица customers + колонка type + nullable поля
ВАРИАНТ 2: таблица parties + person_details / org_details

Пример DDL для фрагмента заказа​

CREATE TABLE customers (
id BIGSERIAL PRIMARY KEY,
type TEXT NOT NULL CHECK (type IN ('person', 'organization')),
email TEXT,
legal_name TEXT
);

CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
customer_id BIGINT NOT NULL REFERENCES customers(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
total_amount NUMERIC(12, 2) NOT NULL
);

CREATE TABLE line_items (
id BIGSERIAL PRIMARY KEY,
order_id BIGINT NOT NULL REFERENCES orders(id),
product_id BIGINT NOT NULL REFERENCES products(id),
quantity INT NOT NULL CHECK (quantity > 0),
unit_price NUMERIC(12, 2) NOT NULL,
UNIQUE (order_id, product_id)
);

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

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

ПодходПлюсМинус
Естественный (ИНН, номер заказа)осмыслен для людейможет измениться, составной
Суррогатный (id BIGSERIAL)стабилен, узкий FKбез JOIN непонятен бизнесу

Подробнее — естественный ключ. На концептуальном уровне фиксируют бизнес-идентификатор; на логическом часто добавляют суррогат.


Нормализация — куда смотреть дальше​

Нормализация — приведение логической схемы к нормальным формам (1NF, 2NF, 3NF, BCNF и далее), чтобы убрать избыточность и аномалии обновления.

На концептуальном уровне не считают нормальные формы — проверяют смысл. На логическом:

  • повторяющиеся группы полей → отдельная таблица;
  • частичные зависимости от составного ключа → вынос;
  • транзитивные зависимости → справочники.
Плохо: order (id, customer_name, customer_email, product_name, qty)
Хорошо: orders + customers + products + line_items

Полный разбор — Основы баз данных. Денормализация на физическом уровне (кэш суммы в orders.total_amount) допустима, если правила синхронизации ясны.


API как граница схемы​

В распределённых системах контракт API — продолжение информационной модели на границе сервиса.

АртефактУровеньРоль
OpenAPI / GraphQL schemaлогический (внешний)какие сущности видны потребителю
JSON Schema тела сообщениялогическийформа полей события
Protobuf .protoлогическийбинарный контракт gRPC
Версия API v1, v2жизненный циклэволюция без поломки клиентов
Внутри сервиса: таблица orders (физическая/логическая схема)
Наружу: OrderDTO { orderId, customerId, lines[] }
Событие: OrderPlaced { ... } в Kafka

Правила:

  • DTO не обязан совпадать 1:1 с таблицами;
  • имена полей API берут из концептуальной модели (customerId, а не client);
  • breaking change в API — как миграция схемы: версия, deprecation, ADR.

Интеграции — раздел 2-09. Конфигурации и данные — JSON Schema для файлов.


Онтология и концептуальная схема​

Концептуальная схема (ER, UML)Онтология (OWL)
Цельспроектировать информационную системусогласовать понятия, обмен, вывод
Аудиторияаналитики, разработчикиэксперты домена, открытые данные
Формадиаграмма + текстлогика, URI, reasoner
Жизненный циклрелизы продуктадолгоживущие отрасли и стандарты
Проверкаревью людей, тест-кейсыreasoner + ревью экспертов
Типичный выходDDL, классыRDF, SPARQL, граф знаний

Одна и та же диаграмма может быть рабочей концептуальной схемой для команды и основой для онтологии, если продукт выходит на открытые данные или граф знаний (330).


Практикум — диаграмма заказа от начала до SQL​

Постановка​

Интернет-магазин: гость или пользователь оформляет заказ, несколько товаров, оплата, возможна частичная отгрузка.

Шаг 1. Глоссарий​

ТерминОпределение
Покупательсторона, на которую оформлен заказ
Пользовательучётная запись на сайте
Заказдокумент покупки
SKUскладская единица
Платёжпопытка списания денег
Отгрузкапередача товара перевозчику

Шаг 2. ER на концептуальном уровне​

Шаг 3. Кардинальности в тексте​

Customer (1) — places — (0..*) Order
Order (1) — contains — (1..*) LineItem
Order (1) — has — (0..*) Payment
Order (1) — has — (0..*) Shipment
LineItem (0..*) — fulfilled_by — (0..*) ShipmentLine

Шаг 4. Атрибуты​

Order: order_number, created_at, status_code, total_amount
LineItem: quantity, unit_price
Payment: amount, status, provider_ref
Shipment: carrier, tracking_number, shipped_at
Product: sku, title
Customer: display_name, customer_type
UserAccount: email, password_hash

Шаг 5. Бизнес-правила​

  • заказ без строк недопустим;
  • total_amount = сумма строк;
  • цифровой товар не создаёт Shipment;
  • гость: Customer без UserAccount.

Шаг 6. Логическая схема (фрагмент DDL)​

CREATE TABLE order_statuses (
code TEXT PRIMARY KEY,
title TEXT NOT NULL
);

CREATE TABLE customers (
id BIGSERIAL PRIMARY KEY,
customer_type TEXT NOT NULL,
display_name TEXT NOT NULL
);

CREATE TABLE user_accounts (
id BIGSERIAL PRIMARY KEY,
customer_id BIGINT REFERENCES customers(id),
email TEXT UNIQUE NOT NULL
);

CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
customer_id BIGINT NOT NULL REFERENCES customers(id),
order_number TEXT UNIQUE NOT NULL,
status_code TEXT NOT NULL REFERENCES order_statuses(code),
created_at TIMESTAMPTZ NOT NULL,
total_amount NUMERIC(12,2) NOT NULL
);

CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
sku TEXT UNIQUE NOT NULL,
title TEXT NOT NULL,
is_digital BOOLEAN NOT NULL DEFAULT false
);

CREATE TABLE line_items (
id BIGSERIAL PRIMARY KEY,
order_id BIGINT NOT NULL REFERENCES orders(id),
product_id BIGINT NOT NULL REFERENCES products(id),
quantity INT NOT NULL,
unit_price NUMERIC(12,2) NOT NULL
);

CREATE TABLE payments (
id BIGSERIAL PRIMARY KEY,
order_id BIGINT NOT NULL REFERENCES orders(id),
amount NUMERIC(12,2) NOT NULL,
status TEXT NOT NULL
);

CREATE TABLE shipments (
id BIGSERIAL PRIMARY KEY,
order_id BIGINT NOT NULL REFERENCES orders(id),
carrier TEXT,
tracking_number TEXT,
shipped_at TIMESTAMPTZ
);

Шаг 7. API (логическая граница)​

{
"orderId": "ord_1042",
"customerId": "cus_88",
"status": "paid",
"lines": [
{ "lineId": "li_1", "sku": "BOOK-42", "quantity": 2, "unitPrice": "600.00" }
],
"totalAmount": "1200.00"
}

Имена полей совпадают с концептуальной моделью. Внутри сервиса orderId может быть BIGINT — маппинг на границе.

Шаг 8. Проверка сценариев​

СценарийПроходит?
Гость, один товар, картаCustomer без UserAccount, Payment
Два товара, две отгрузкидва Shipment, ShipmentLine
Цифровая книгаProduct.is_digital = true, Shipment = 0
Отмена до оплатыstatus draft → cancelled

Альтернативные модели данных​

Концептуальная схема не привязана к SQL.

МодельКак отразить концепциюСтатья
Документы JSONвложенные lines в orderконфигурации
Графузлы Order, Customer, рёбра PLACEDграфы, 330
Key-valueключи по id, ссылки по FK в значенииNoSQL
Колоночноете же сущности, семейства столбцовNoSQL

Концептуальный уровень один; логический выбирают под нагрузку и команду.


Частые ошибки при моделировании​

ОшибкаПоследствиеЧто делать
Пропуск концептуального этапаполя status, type без смыславоркшоп с бизнесом
Имена из legacy (tbl_ord_v2)новички не понимают доменязык бизнеса
M:N без промежуточной сущностиневозможно хранить qty, priceСтрокаЗаказа
Игнор кардинальностейсиротские строки в БДFK и NOT NULL
Один огромный диаграмманикто не читаетразбить по bounded context
Схема без сценариевдыры в жизненном цикле3–5 кейсов из продакшена
API 1:1 с таблицамиутечка внутренней структурыDTO по концепции

Чеклист проектирования концептуальной схемы​

Используйте перед ревью с архитектором и перед миграциями.

Сущности и атрибуты​

  • Каждая сущность имеет определение на языке бизнеса
  • Атрибуты принадлежат правильной сущности (не "всё в Заказ")
  • Справочники (статус, валюта, страна) вынесены отдельно
  • Нет дублирующих сущностей с разными именами

Связи​

  • У каждой связи указана кардинальность (min, max)
  • M:N разложены через ассоциативную сущность
  • Слабые сущности помечены (зависимость от родителя)

Согласованность​

  • Термины совпадают с глоссарием предприятия
  • Диаграмма согласована с онтологией, если она есть
  • Bounded context в DDD отмечены на диаграмме

Проверка​

  • Пройдены сценарии "создать", "изменить", "отменить", "отчёт"
  • Спорные решения записаны в ADR
  • План маппинга в SQL или API намечен

Сопровождение​

  • Диаграмма в git рядом с кодом
  • Версия модели указана в changelog
  • Владелец схемы назначен

Инструменты​

ИнструментНазначение
draw.io / diagrams.netER, экспорт в репозиторий
dbdiagram.ioER → SQL
PlantUMLтекстовое описание диаграмм
Enterprise Architect, Visual ParadigmUML, RE
pgModeler, MySQL Workbenchлогическая + физическая схема
Mermaid в markdownдиаграммы в документации, как в этой статье

Выбор инструмента менее важен, чем процесс согласования с бизнесом.


Нотация crow's foot (лапка ворона)​

Помимо классической нотации Chen, в инструментах часто используют crow's foot — символы на концах линий.

СимволКратность
Вертикальная черта |ровно один
Круг ○ноль
"Лапка" <много
Покупатель ||——o{ Заказ
|| = ровно один покупатель на стороне заказа?
На стороне Покупателя: один покупатель — много заказов
o{ = ноль или много заказов у покупателя

Чтение связи с обеих сторон:

  • у одного Покупателя — ноль или много Заказов;
  • у каждого Заказа — ровно один Покупатель.

Практика: на воркшопе с бизнесом рисуют Chen или блок-схему; в технической документации — crow's foot из draw.io.


Слабые сущности и идентифицирующие связи​

Слабая сущность не имеет смысла без родителя. Примеры:

  • СтрокаЗаказа без Заказа;
  • Этаж без Здания (в модели недвижимости);
  • Ответ на вопрос без Анкеты.

На диаграмме — двойной прямоугольник или пометка "weak". Ключ:

СтрокаЗаказа: (order_id, line_number)
order_id — FK на Заказ
line_number — порядковый номер внутри заказа

Альтернатива в современных схемах — суррогатный id у строки плюс обязательный FK order_id NOT NULL. Концептуально связь остаётся идентифицирующей.


Обратное проектирование из существующей БД​

Когда документации нет, схему восстанавливают из DDL (reverse engineering).

ШагДействие
1Экспорт DDL из СУБД
2Автогенерация ER в pgModeler / MySQL Workbench
3Переименование таблиц в язык бизнеса
4Выделение лишних технических таблиц (audit, outbox)
5Воркшоп — сверка с реальными процессами

Опасность: автоматическая диаграмма отражает как было построено, а не как должно быть. Используют reverse engineering как стартовую точку, затем ревизию концепции с экспертом домена и сверку с онтологией.

Таблица tbl_ord_v2 → переименовать концептуально в Order
Колонка cust_ref → customer_id, связь с Customer

Супертип и подтипы в ER​

Наследование ФизЛицо / ЮрЛицо от Покупатель моделируют тремя способами.

Одна таблица с дискриминатором​

CREATE TABLE customers (
id BIGSERIAL PRIMARY KEY,
kind TEXT NOT NULL CHECK (kind IN ('person', 'org')),
inn TEXT, -- только для org
passport TEXT -- только для person
);

Плюс — простые запросы. Минус — много nullable-полей.

Таблица на подтип​

CREATE TABLE parties (id BIGSERIAL PRIMARY KEY, kind TEXT);
CREATE TABLE persons (party_id PRIMARY KEY REFERENCES parties(id), ...);
CREATE TABLE organizations (party_id PRIMARY KEY REFERENCES parties(id), inn TEXT, ...);

Плюс — чистые ограничения. Минус — JOIN при выборке.

Только на концептуальном уровне​

На ER рисуют треугольник обобщения; в SQL оставляют одну таблицу до появления требований регулятора.

Выбор фиксируют в ADR.


Временные и исторические данные​

Концептуальная схема должна ответить, нужна ли история.

ВопросВлияние на модель
Меняется ли цена товара задним числом?LineItem.unit_price хранит цену на момент заказа
Нужен ли аудит статусов?сущность OrderStatusHistory
Действует ли договор периодами?valid_from, valid_to на связи
OrderStatusHistory: order_id, status_code, changed_at, changed_by

Без явного решения на концептуальном уровне разработчики добавляют updated_at и теряют прошлые значения.


Согласование с тестированием​

Тест-кейсы — проверка, что схема полна.

Сценарий тестаПроверка модели
Создать заказ с нулевой суммойдопустимо ли? инвариант на Order
Удалить покупателя с заказамиCASCADE или запрет?
Два платежа на один заказкардинальность Payment

QA получает не только UI-сценарии, но и матрицу сущностей из концептуальной схемы. Пробелы находят до миграций.


Связь с соседними темами​

ТемаСтатья
Смысл полей326
Правила и фреймы327
Онтология328
RDF, OWL330
Таблицы и алгебра322
Множества, ключи321
SQL7
Структуры данных3-02
Системы и модели22

Краткое резюме​

Концептуальная схема фиксирует сущности, атрибуты и связи предметной области без деталей СУБД. Информационная модель добавляет логический и физический уровни. ER-модель строят пошагово; кардинальности определяют будущие FK. UML и ER дополняют друг друга в зависимости от аудитории. Domain model в DDD переносит схему в код. На уровне предприятия схема связана с MDM и API. Маппинг в SQL следует правилам сущность→таблица, M:N→промежуточная таблица. Нормализация — следующий шаг логического уровня. Онтология усиливает согласование между системами.


Связанные статьи​


Содержание