← Назад к вопросам

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

2.3 Middle🔥 161 комментариев
#Архитектура систем#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

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

Зачем нужны три модели?

Моделирование данных похоже на проектирование дома:

  • Концептуальная модель — «Нам нужны спальня, кухня, ванная и гостиная» (идея)
  • Логическая модель — «Спальня 4×5м, кухня с газовой плитой, ванная с ванной и душем» (план)
  • Физическая модель — «Кирпичная кладка толщиной 50см, электропроводка в стенах, водопровод диаметром 2см» (реализация)

Каждый уровень добавляет детали и говорит конкретному участнику проекта именно то, что ему нужно.

1. Концептуальная модель данных

Определение: Высокоуровневое представление того, какие сущности и отношения существуют в предметной области, независимо от технических деталей.

Характеристики:

  • ✓ Абстрактная, понятна бизнесу
  • ✓ Не содержит技технических деталей
  • ✓ Сосредоточена на сущностях и их отношениях
  • ✓ Не привязана ни к какой СУБД
  • ✓ Использует бизнес-терминологию

Пример: интернет-магазин

Сущности:
- Клиент
- Заказ
- Товар
- Катёгория товара

Отношения:
- Клиент РАЗМЕЩАЕТ Заказ (1:N)
- Заказ СОДЕРЖИТ Товары (M:N)
- Товар ПРИНАДЛЕЖИТ Категории (M:1)
- Клиент ПРОСМАТРИВАЕТ Товары (M:N)

Диаграмма концептуальной модели (Entity-Relationship, ER-диаграмма):

┌─────────┐         1  N  ┌────────┐
│ Клиент  │──────Размещает──│ Заказ  │
└─────────┘                └────────┘
     │                         │
     │ Просматривает      М    │ Содержит
     │ (M:N)                   │ (M:N)
     │                         │
     │                         ▼
     └─────────────────►┌──────────────┐
                        │    Товар     │
                        ├──────────────┤
                        │ - ID         │
                        │ - Название  │
                        │ - Описание   │
                        │ - Цена       │
                        │ - Категория  │
                        └──────────────┘

Кто создаёт: системный аналитик, бизнес-аналитик Аудитория: бизнес, менеджеры, аналитики Инструменты: диаграммы ER, описание сущностей

2. Логическая модель данных

Определение: Представление структуры данных, специфичное для определённой СУБД (реляционная, документная, граф и т.д.), но всё ещё независимое от физической реализации.

Характеристики:

  • ✓ Промежуточный уровень детализации
  • ✓ Зависит от типа СУБД (реляционная, NoSQL)
  • ✓ Описывает таблицы, их колонки, типы данных
  • ✓ Определяет первичные и внешние ключи
  • ✓ Нормализована (обычно до 3NF)
  • ✓ Всё ещё понятна архитектору и аналитику

Пример: логическая модель для реляционной БД

Таблица: CUSTOMERS
┌──────────────────┬──────┬──────────┐
│ Колонка          │ Тип  │ Ограничен│
├──────────────────┼──────┼──────────┤
│ customer_id (PK) │ INT  │ NOT NULL │
│ first_name       │ VARCHAR(50) │ NOT NULL │
│ last_name        │ VARCHAR(50) │ NOT NULL │
│ email (UNIQUE)   │ VARCHAR(100)│ UNIQUE   │
│ phone            │ VARCHAR(20) │ NULLABLE │
│ created_at       │ TIMESTAMP   │ DEFAULT NOW │
└──────────────────┴──────┴──────────┘

Таблица: ORDERS
┌──────────────────┬──────┬──────────┐
│ order_id (PK)    │ INT  │ NOT NULL │
│ customer_id (FK) │ INT  │ NOT NULL │
│ order_date       │ DATE │ NOT NULL │
│ total_amount     │ DECIMAL(10,2)│ NOT NULL │
│ status           │ VARCHAR(20) │ DEFAULT pending │
└──────────────────┴──────┴──────────┘
FK: customer_id → CUSTOMERS.customer_id

Таблица: ORDER_ITEMS
┌──────────────────┬──────┬──────────┐
│ order_item_id (PK)│INT  │ NOT NULL │
│ order_id (FK)    │ INT  │ NOT NULL │
│ product_id (FK)  │ INT  │ NOT NULL │
│ quantity         │ INT  │ NOT NULL │
│ unit_price       │ DECIMAL(10,2)│ NOT NULL │
└──────────────────┴──────┴──────────┘
FK: order_id → ORDERS.order_id
FK: product_id → PRODUCTS.product_id

Таблица: PRODUCTS
┌──────────────────┬──────┬──────────┐
│ product_id (PK)  │ INT  │ NOT NULL │
│ name             │ VARCHAR(100)│ NOT NULL │
│ description      │ TEXT │ NULLABLE │
│ price            │ DECIMAL(10,2)│ NOT NULL │
│ category_id (FK) │ INT  │ NULLABLE │
│ stock            │ INT  │ DEFAULT 0 │
└──────────────────┴──────┴──────────┘
FK: category_id → CATEGORIES.category_id

Схема связей:

CUSTOMERS
    │ (1)
    │ (1:N)
    │
ORDERS
    │ (N)
    │ (1:N)
    │
ORDER_ITEMS
    │ (M)
    │ (M:1)
    │
PRODUCTS ──────────► CATEGORIES
    (M)  (M:1)

PK = Primary Key (первичный ключ) FK = Foreign Key (внешний ключ)

Кто создаёт: архитектор БД, старший разработчик, системный аналитик Аудитория: разработчики, архитекторы Инструменты: ERDPlus, Lucidchart, DataGrip, Visio

3. Физическая модель данных

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

Характеристики:

  • ✓ Специфична для конкретной СУБД (PostgreSQL, MySQL, Oracle и т.д.)
  • ✓ Содержит SQL DDL код
  • ✓ Определяет индексы для оптимизации
  • ✓ Описывает партицирование, compression, и другие физические характеристики
  • ✓ Учитывает производительность и хранилище
  • ✓ Включает constraints и triggers

Пример: физическая модель для PostgreSQL

-- Таблица CUSTOMERS
CREATE TABLE customers (
    customer_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    phone VARCHAR(20),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Индекс для ускорения поиска по email
CREATE INDEX idx_customers_email ON customers(email);

-- Таблица ORDERS
CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INTEGER NOT NULL REFERENCES customers(customer_id) ON DELETE CASCADE,
    order_date DATE NOT NULL,
    total_amount DECIMAL(10,2) NOT NULL,
    status VARCHAR(20) DEFAULT pending CHECK (status IN (pending, processing, shipped, delivered, cancelled)),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Индекс для ускорения поиска заказов по клиенту
CREATE INDEX idx_orders_customer_id ON orders(customer_id);

-- Индекс для быстрой фильтрации по дате
CREATE INDEX idx_orders_date ON orders(order_date);

-- Таблица ORDER_ITEMS (junction table для M:N отношения)
CREATE TABLE order_items (
    order_item_id SERIAL PRIMARY KEY,
    order_id INTEGER NOT NULL REFERENCES orders(order_id) ON DELETE CASCADE,
    product_id INTEGER NOT NULL REFERENCES products(product_id),
    quantity INTEGER NOT NULL CHECK (quantity > 0),
    unit_price DECIMAL(10,2) NOT NULL CHECK (unit_price >= 0)
);

-- Составной индекс для быстрого поиска товаров в заказе
CREATE INDEX idx_order_items_order_product ON order_items(order_id, product_id);

-- Таблица PRODUCTS
CREATE TABLE products (
    product_id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    description TEXT,
    price DECIMAL(10,2) NOT NULL CHECK (price > 0),
    category_id INTEGER REFERENCES categories(category_id),
    stock INTEGER DEFAULT 0 CHECK (stock >= 0),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Индекс для поиска по категории
CREATE INDEX idx_products_category ON products(category_id);

-- Таблица CATEGORIES
CREATE TABLE categories (
    category_id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL UNIQUE,
    description TEXT,
    parent_category_id INTEGER REFERENCES categories(category_id)
);

-- Триггер для обновления updated_at при изменении
CREATE OR REPLACE FUNCTION update_timestamp()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = CURRENT_TIMESTAMP;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER customers_update_timestamp
BEFORE UPDATE ON customers
FOR EACH ROW EXECUTE FUNCTION update_timestamp();

Кто создаёт: DBA, архитектор БД Аудитория: разработчики, DBA Инструменты: SQL код, миграции (Liquibase, Flyway), управление БД

Сравнительная таблица

АспектКонцептуальнаяЛогическаяФизическая
Уровень абстракцииВысокийСреднийНизкий
Привязка к СУБДНетДа, но универсальноДа, специфична
Основные компонентыСущности, отношенияТаблицы, столбцы, ключиТаблицы, индексы, constraints
НормализацияN/AДа, до 3NFМожет быть денормализована для performance
Кто создаётАналитик, бизнесАрхитектор БД, разработчикDBA, архитектор
АудиторияМенеджеры, бизнесРазработчикиРазработчики, DBA
ИнструментыER диаграммы, описаниеERDPlus, VisioSQL DDL, миграции
Примеры элементовCustomer, Ordercustomers (таблица), customer_id (столбец)CREATE TABLE, INDEX, CONSTRAINT
Пример изменения"Добавить сущность Рецензия""Добавить столбец rating в таблицу reviews""Добавить индекс на rating для оптимизации"
ОтказоустойчивостьОбщее пониманиеТехническая точностьПроизводительность

Пример эволюции моделей: система управления блогом

Концептуальная модель:

Автор пишет Статью
Статья содержит Комментарии
Комментарий оставляет Читатель
Статья имеет Теги

Логическая модель:

Таблица: USERS
- user_id (PK)
- username
- email
- role (author/reader)

Таблица: POSTS
- post_id (PK)
- author_id (FK)
- title
- content
- published_date

Таблица: COMMENTS
- comment_id (PK)
- post_id (FK)
- author_id (FK)
- content
- created_date

Таблица: TAGS
- tag_id (PK)
- name

Таблица: POST_TAGS (M:N)
- post_id (FK)
- tag_id (FK)

Физическая модель (PostgreSQL):

CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    role VARCHAR(20) CHECK (role IN (author, reader)),
    created_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_users_email ON users(email);

-- ... остальные таблицы с индексами, constraints, triggers

Когда менять модели?

Концептуальная модель меняется:

  • Добавляется новая сущность (Рецензии)
  • Изменяется отношение между сущностями
  • Появляются новые бизнес-требования

Логическая модель меняется:

  • Добавляется новая таблица
  • Изменяется нормализация
  • Добавляются новые ограничения
  • Выявляется ошибка в структуре

Физическая модель меняется:

  • Добавляются индексы (обычно после анализа production)
  • Партицирование таблиц
  • Оптимизация под конкретный workload
  • Кэширование и денормализация для performance

Лучшие практики

Начинайте с концептуальной модели

  • Согласуйте с бизнесом, что такое сущности и отношения
  • Убедитесь, что все требования учтены

Детализируйте в логической модели

  • Нормализуйте до 3NF
  • Определите все ограничения и ключи
  • Проверьте с разработчиками, что это выполнимо

Оптимизируйте в физической модели

  • Добавляйте индексы на основе реальных запросов
  • Денормализуйте где нужно, но задокументируйте почему
  • Мониторьте и переиндексируйте по мере роста данных

Поддерживайте документацию

  • Обновляйте все три модели при изменениях
  • Новые разработчики смогут быстро разобраться

Заключение

Три уровня моделирования данных служат разным целям:

  1. Концептуальная — общее понимание что хранится (для всех)
  2. Логическая — как организованы данные в СУБД (для архитекторов и разработчиков)
  3. Физическая — как оптимизированы данные в конкретной системе (для DBA и разработчиков)

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

В чем разница между концептуальной физической и логической моделью данных? | PrepBro