1. Анализ требований и концептуальное проектирование: сущности Клиент, Договор, Оплата и Задача
Анализ требований и концептуальное проектирование: сущности Клиент, Договор, Оплата и Задача
Добро пожаловать на курс «Проектирование базы данных CRM: от идеи до SQL-скриптов». Это первая статья нашего цикла, в которой мы пройдем путь от абстрактной идеи «нужно где-то хранить данные» до конкретных таблиц и связей в базе данных.
Многие новички совершают одну и ту же ошибку: сразу бросаются писать код или создавать таблицы в Excel. Мы поступим иначе. Мы начнем с проектирования. Представьте, что вы архитектор: прежде чем класть кирпичи, нужно начертить план здания. В мире баз данных этот план называется схемой.
Шаг 1: Анализ предметной области
Наша цель — создать базу данных (БД) для CRM-системы (Customer Relationship Management). Давайте разберем требования, которые поставил перед нами заказчик (или мы сами):
> Спроектировать БД для учета клиентов, договоров, оплат и задач.
Из этого короткого предложения мы должны выделить ключевые сущности. Сущность — это объект реального мира, информацию о котором мы хотим хранить.
Выделяем сущности
Определяем атрибуты
Теперь для каждой сущности нужно определить набор характеристик (атрибутов), которые нам важны.
* Клиент: Нам нужно знать, как к нему обращаться (Имя), как связаться (Email, Телефон) и когда он появился в базе (Дата регистрации). * Договор: У договора всегда есть номер, дата подписания и сумма. * Оплата: Сумма платежа и дата, когда деньги поступили. * Задача: Что нужно сделать (Описание), к какому сроку (Дедлайн) и выполнена ли она (Статус).
Шаг 2: Определение связей и Нормализация
Просто создать четыре таблицы недостаточно. Данные должны «общаться» друг с другом. Здесь в игру вступает реляционная модель.
Типы связей
Давайте подумаем, как наши сущности связаны между собой:
!Концептуальная схема связей между сущностями CRM
Зачем нужна нормализация?
Нормализация — это процесс организации данных для уменьшения избыточности. Давайте применим её принципы к нашей задаче.
Представьте, если бы мы хранили всё в одной гигантской таблице Excel:
| Клиент | Телефон | Номер договора | Сумма договора | Дата оплаты | Сумма оплаты | | :--- | :--- | :--- | :--- | :--- | :--- | | Иван | 555-01 | А-100 | 10000 | 01.01.2023 | 5000 | | Иван | 555-01 | А-100 | 10000 | 15.01.2023 | 5000 |
Видите проблему? Мы дублируем имя «Иван», телефон и сумму договора для каждого платежа. Если Иван сменит телефон, нам придется менять его во всех строчках. Это нарушение Второй и Третьей нормальных форм.
Чтобы это исправить, мы разделяем данные на разные таблицы и связываем их через ключи:
* Primary Key (PK, Первичный ключ): Уникальный идентификатор строки (например, ID клиента). * Foreign Key (FK, Внешний ключ): Ссылка на PK другой таблицы (например, в таблице Договоров мы храним ID клиента).
Шаг 3: Физическое проектирование (SQL-скрипты)
Теперь переведем нашу концепцию на язык SQL. Мы будем использовать синтаксис, совместимый с большинством популярных СУБД (PostgreSQL, MySQL).
1. Таблица Клиентов (Clients)
Сначала создаем независимые сущности.
Разбор:
* client_id SERIAL PRIMARY KEY: Уникальный номер клиента, который генерируется автоматически.
* NOT NULL: Обязательное поле. Клиент без имени нам не нужен.
2. Таблица Договоров (Contracts)
Договор не может существовать без клиента, поэтому добавляем ссылку client_id.
Разбор:
* DECIMAL(10, 2): Тип данных для денег. Хранит 10 цифр всего, из них 2 после запятой. Никогда не используйте FLOAT для денег из-за проблем с точностью округления!
* FOREIGN KEY: Это правило говорит базе данных: «Нельзя создать договор для клиента, которого не существует в таблице Clients».
3. Таблица Оплат (Payments)
Оплата привязана к договору, а не напрямую к клиенту (так мы точно знаем, за что пришли деньги).
4. Таблица Задач (Tasks)
Задачи привязываем к клиенту. Также добавим статус выполнения.
Разбор:
* TEXT: Используем для описания, так как длина может быть любой.
* BOOLEAN: Идеально подходит для статуса «сделано / не сделано».
Итоги первой части
Мы с вами проделали путь от простого текстового описания до готовых SQL-инструкций. Что мы получили в итоге?
FOREIGN KEY) мы не потеряем данные. Нельзя удалить клиента, если у него есть действующие договоры (если не настроено каскадное удаление, о чем мы поговорим в следующих статьях).В следующей статье мы наполним нашу базу тестовыми данными и научимся писать запросы для получения отчетов: узнаем, кто из клиентов принес больше всего денег и какие задачи просрочены.