В чем разница между Business Model и Entity Model?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между Business Model и Entity Model
Business Model и Entity Model — это две разные концепции проектирования, которые решают разные задачи и находятся на разных уровнях абстракции архитектуры приложения.
Business Model
Business Model отражает бизнес-логику и процессы предметной области. Это концептуальное представление сущностей и их взаимоотношений в реальном мире. Business Model:
- Фокусируется на бизнес-правилах — что нужно делать и как это должно работать
- Независим от реализации — не привязан к технологиям, БД, фреймворкам
- Содержит инвариванты — правила, которые всегда должны быть истинны
- Предметно-ориентирован — использует язык бизнеса
Примеры:
// Business Model — Order
class Order {
id: string;
customerId: string;
items: OrderItem[];
status: "pending" | "confirmed" | "shipped" | "delivered";
totalPrice: Money;
// Бизнес-правило: статус можно изменить только в определённом порядке
confirmOrder(): void {
if (this.status !== "pending") {
throw new Error("Заказ уже подтверждён");
}
this.status = "confirmed";
}
// Бизнес-правило: цена вычисляется с учётом скидок
calculateTotal(discounts: Discount[]): Money {
// Бизнес-логика расчёта
}
}
Entity Model
Entity Model — это техническое представление данных для хранения в базе данных. Это то, как данные физически организованы и структурированы в PostgreSQL, MongoDB и т.д. Entity Model:
- Фокусируется на хранении — как структурировать таблицы, индексы, связи
- Привязан к конкретной БД — учитывает особенности реляционной или NoSQL БД
- Оптимизирован для запросов — может содержать денормализацию для производительности
- Технический — использует терминологию БД
Примеры:
// Entity Model — Order в PostgreSQL
interface OrderEntity {
id: string;
customer_id: string;
status: "pending" | "confirmed" | "shipped" | "delivered";
total_price_cents: number; // Храним в центах для точности
created_at: Date;
updated_at: Date;
}
interface OrderItemEntity {
id: string;
order_id: string; // FK для связи
product_id: string;
quantity: number;
price_cents: number;
}
Основные отличия
| Параметр | Business Model | Entity Model |
|---|---|---|
| Уровень | Домен, бизнес-логика | Инфраструктура, хранение |
| Язык | Предметный, бизнес | Технический |
| Ответственность | Инвариванты, правила | Структура БД, запросы |
| Изменчивость | Меняется редко | Может меняться часто |
| Зависимость | Независим | Зависит от выбора БД |
| Пример поля | totalPrice: Money | total_price_cents: number |
Как они работают вместе
- Domain Layer работает с Business Models
- Application Layer преобразует между Business и Entity models
- Infrastructure Layer работает с Entity Models и БД
// Application Service
class CreateOrderService {
async execute(command: CreateOrderCommand): Promise<void> {
// 1. Создаём Business Model
const order = new Order(command.customerId);
// 2. Применяем бизнес-логику
order.addItem(item);
if (order.totalPrice > MAX_PRICE) {
throw new OrderTooExpensiveError();
}
// 3. Преобразуем в Entity Model для сохранения
const entity = this.mapper.toPersistence(order);
// 4. Сохраняем в БД
await this.orderRepository.save(entity);
}
}
Вывод
Business Model — это модель предметной области с правилами и инвариантами. Entity Model — это техническое представление данных для хранения. Разделение этих моделей позволяет:
- Сохранить чистоту доменного слоя
- Легко менять реализацию БД
- Легче тестировать бизнес-логику
- Применять Clean Architecture и DDD
Это одна из основ Clean Architecture и Domain-Driven Design.