Чтение 5 минут

Как спроектировать структуру данных для сайта


Как спроектировать структуру данных для сайта - Студия Вебтую

Ошибки в структуре данных всплывают не сразу. Первые месяцы всё работает: товары добавляются, заказы оформляются, отчёты выгружаются. Проблемы начинаются через год, когда появляется вторая складская точка, старые заказы вдруг «переоцениваются» по новому прайсу, а простая просьба «покажи выручку по филиалам за прошлый квартал» оказывается невыполнимой. Переделывать в этот момент дорого: данных много, они уже связаны с бухгалтерией и рекламой. Ниже — правила, которые мы соблюдаем при проектировании, чтобы этой ситуации не было.

С чего начинается проектирование

До первой таблицы мы отвечаем на четыре вопроса вместе с заказчиком. Это занимает пару встреч и экономит месяцы переделок.

  1. Какие сущности есть в бизнесе. Не «что будет на сайте», а что реально существует: клиент, заказ, товар, услуга, договор, объект, сотрудник, филиал.
  2. Как они связаны. Один клиент — много заказов. Один заказ — много позиций. Товар может быть в нескольких категориях. Эти связи важнее, чем набор полей.
  3. Что должно храниться исторически. Что именно нельзя терять при изменениях: цены, статусы, состав заказа, переписку.
  4. Какие отчёты понадобятся. Отчёты определяют структуру не меньше, чем сами данные. Если нужен разрез по филиалам, филиал должен быть отдельной сущностью, а не текстом в примечании.

Схема, нарисованная на этом этапе на одном листе, обычно понятнее любого технического задания и лучше проверяется заказчиком.

Базовые принципы

  • Одна сущность — одна таблица. Товары, заказы, клиенты хранятся отдельно и связываются между собой, а не складываются в общую таблицу с полем «тип записи».
  • У каждой записи постоянный идентификатор. Он не меняется никогда, даже если поменялось название, артикул или адрес. Всё остальное — атрибуты, которые могут меняться.
  • Связи через идентификаторы, а не через названия. Название компании клиент однажды напишет иначе, и связь развалится молча.
  • Единый формат дат, сумм и телефонов. Формат задаётся на уровне хранения, а не на уровне договорённостей между разработчиками.
  • Историю не переписываем. Цена, наименование и состав в заказе фиксируются на момент покупки и живут вместе с заказом.
  • Одно значение — одно поле. Ни списков через запятую, ни «города и области» в одной строке.

Типичные ошибки и чем они оборачиваются

ОшибкаЧем оборачиваетсяКак правильно
Список значений через запятую в одном полеНельзя фильтровать, считать и связыватьОтдельная таблица связей
Цена только в справочнике товараСтарые заказы пересчитываются по новому прайсуКопия цены и наименования в позиции заказа
Физическое удаление записейТеряется история и ломаются связиПометка об удалении, запись остаётся
Универсальная таблица «ключ-значение» для всегоМедленные запросы, невозможность проверить данныеЯвные поля для того, что известно заранее
Разные форматы телефонов и почтыДубли клиентов, письма не доходятНормализация при сохранении
Статус заказа текстом в свободной форме«Отгружен», «отгружено», «Отгр.» — три разных статусаОграниченный список значений
Хранение вычисляемых сумм без исходных данныхСумму нельзя перепроверить и пересчитатьХранить и составляющие, и итог

Что важно заложить сразу

Есть вещи, которые почти ничего не стоят в начале и дорого добавляются потом.

  • Даты создания и изменения у всех основных сущностей. Без них невозможно разобраться, когда и что произошло.
  • Кто изменил запись. В системах, где работают несколько человек, это первый вопрос при любом разборе.
  • Мягкое удаление там, где важна история: клиенты, заказы, документы.
  • Индексы под частые запросы. Поиск по телефону, выборка заказов клиента, фильтр по статусу и датам.
  • Ограничения целостности. Нельзя создать заказ без клиента, позицию без заказа, платёж без договора. Проверка на уровне базы надёжнее проверки в коде, потому что данные попадают в базу не только через интерфейс.
  • Внешние идентификаторы для связи с учётной системой, если обмен планируется хотя бы теоретически.

Про историю и «текущее состояние»

Самая частая архитектурная ошибка — хранить только текущее состояние. Пока система маленькая, это удобно: одна строка, одно значение. Как только появляется вопрос «а какой был статус на конец месяца» или «почему в отчёте за прошлый год другая сумма», выясняется, что ответа нет.

Мы разделяем данные на три типа и обращаемся с ними по-разному:

Тип данныхПримерКак храним
СправочникиТовары, услуги, сотрудникиТекущее состояние, изменения допустимы
ДокументыЗаказ, счёт, договорФиксируются целиком на момент создания
СобытияСмена статуса, платёж, звонокТолько добавление, ничего не переписывается

Такое разделение снимает большинство споров о том, где хранить цену и что делать при переименовании товара.

Производительность закладывается структурой

Медленная система редко бывает медленной из-за сервера. Чаще причина в структуре и запросах.

  • Индексы ставим под те запросы, которые действительно выполняются, а не под каждое поле: лишние индексы замедляют запись.
  • Списки с постраничным выводом делаем так, чтобы не считать всю таблицу при каждом открытии страницы.
  • Тяжёлые отчёты считаем отдельно и сохраняем результат, а не пересчитываем при каждом открытии.
  • Заранее решаем, что делать с ростом: миллион строк в таблице заказов ведёт себя не так, как десять тысяч.
  • Проверяем систему на объёме, близком к боевому, а не на двадцати тестовых записях.

Структура будет меняться — это нормально

Ни одна схема не остаётся неизменной. Бизнес меняется, появляются новые сущности и разрезы. Важно не угадать всё заранее, а сделать изменения предсказуемыми.

  1. Миграции хранятся в репозитории вместе с кодом, а не выполняются руками через панель управления.
  2. Одинаково применяются на тестовом и боевом контуре, в одном и том же порядке.
  3. Перед применением делается свежая копия, и восстановление из неё проверено хотя бы однажды.
  4. Крупные изменения разбиваются на шаги: добавить поле, заполнить, переключить код, убрать старое.
  5. Схема описана в одном месте, и это описание обновляется вместе с изменениями.

Что в итоге

Хорошая структура данных не выглядит остроумной — она выглядит скучно и предсказуемо. Явные сущности, постоянные идентификаторы, зафиксированная история, ограничения на уровне базы. Именно эта скука позволяет через два года добавить филиал, новый канал продаж или обмен с учётной системой, не переписывая систему целиком.

Если вы планируете внутреннюю систему или чувствуете, что текущая база данных мешает развиваться, мы спроектируем структуру под ваши процессы и отчёты: разработаем информационную систему — CRM, ERP или учётный контур под конкретные задачи. Начинаем с разбора сущностей и связей, а не с выбора технологий.

Нужна помощь с сайтом?

Срочные ошибки исправим за 24 часа, работа от 2 500 руб./час.

Техническая поддержка и сопровождение сайта

По теме статьи

Мы это уже делали

Похожие статьи

Нужен новый сайт?

Оставьте контакты — вернёмся с вопросами по задаче и ориентиром по срокам и стоимости.

Читайте также

Разбираем задачи, с которыми к нам приходят: от структуры сайта до поддержки и продвижения.

Внимание: мошенники представляются сотрудниками Вебтую Внимание: мошенники представляются сотрудниками Вебтую Посторонний человек обращается к рекламным и маркетинговым агентствам от имени Вебтую через Telegram-аккаунт @vetaroki22010, заказывает работы и не оплачивает и 10-09-2026 Читать Работа в digital: процессы, инструменты и команда Работа в digital: процессы, инструменты и команда Цифровые проекты редко проваливаются из-за технологий: чаще мешает организация работы. Разбираем этапы, роли, постановку задач, инструменты распределённой коман 30-08-2026 Читать Реклама и аналитика: как считать заявки, а не клики Реклама и аналитика: как считать заявки, а не клики Показы и клики не отвечают на вопрос, сколько принесла реклама. Разбираем, как настроить цели, разметить источники, учесть звонки и связать заявку со сделкой, ч 30-08-2026 Читать Поддержка сайта: обновления, резервные копии и безопасность Поддержка сайта: обновления, резервные копии и безопасность Сайт без регулярного обслуживания ломается предсказуемо. Разбираем, из чего состоит поддержка: обновления, резервные копии, доступы, безопасность, выбор хостинг 30-08-2026 Читать Техническое SEO: индексация, скорость и структура сайта Техническое SEO: индексация, скорость и структура сайта Техническая часть сайта решает, попадут ли страницы в индекс и дождётся ли их посетитель. Разбираем структуру и адреса, индексацию и дубли, работу с устаревшими 30-08-2026 Читать Продвижение сайта в поиске: стратегия, семантика и ссылки Продвижение сайта в поиске: стратегия, семантика и ссылки Разбираем продвижение сайта в поиске от постановки цели до регулярной работы: как собрать и разложить семантику по страницам, что должно быть на посадочной стра 30-08-2026 Читать Тексты для сайта: как писать, чтобы читали и покупали Тексты для сайта: как писать, чтобы читали и покупали Как выбрать тему для страницы и построить текст, который просматривают глазами и дочитывают, чем заменить оценочные формулировки, как переработать существующую 30-08-2026 Читать Автоматизация бизнеса: CRM, ERP и искусственный интеллект Автоматизация бизнеса: CRM, ERP и искусственный интеллект С чего начинать автоматизацию и что автоматизировать в первую очередь, чем различаются CRM, ERP и системы документооборота, внедрять по модулям или всё сразу, г 30-08-2026 Читать Как устроена разработка: технологии, тестирование и инструменты Как устроена разработка: технологии, тестирование и инструменты Из чего состоит веб-проект, как выбирают язык, фреймворк и базу данных, зачем нужны тестирование и контроль версий, где заканчиваются возможности low-code и ген 30-08-2026 Читать Создание сайта: от технического задания до запуска Создание сайта: от технического задания до запуска Проекты срываются не из-за технологий, а из-за неясных договорённостей. Разбираем весь путь создания сайта: как сформулировать цель, что должно быть в техническ 30-08-2026 Читать
Обсудить проект