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

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

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

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

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

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


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

Если сразу рисовать таблицы, команда может не согласовать смысл с бизнесом. Типичный симптом — поле 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→промежуточная таблица. Нормализация — следующий шаг логического уровня. Онтология усиливает согласование между системами.


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


Глоссарий кратких терминов статьи

ТерминРасшифровка
EREntity-Relationship — модель "сущность–связь"
UMLUnified Modeling Language — унифицированный язык моделирования
DDDDomain-Driven Design — проектирование от предметной области
DDLData Definition Language — язык определения схемы (CREATE TABLE)
FKForeign Key — внешний ключ
PKPrimary Key — первичный ключ
MDMMaster Data Management — управление эталонными справочниками
ANSI/SPARCстандарт трёхуровневой архитектуры схемы данных
DTOData Transfer Object — объект передачи данных на границе API
ADRArchitecture Decision Record — запись архитектурного решения

Содержание