Как можно эффективно разработать систему складского учета, которая будет обладать динамическими характеристиками?

У меня есть проект, связанный с разработкой системы многопользовательского учета для домашних складов. Каждый пользователь имеет доступ к своему собственному складу, где могут учитываться различные объекты. Поставщик системы планирует создать базовую конфигурацию, соответствующую потребностям клиента, с возможностью изменения структуры и состава объекта учета в рамках одной предметной области. Вся настройка должна выполняться через администраторский интерфейс.

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

Например, в качестве одного из проектов может выступать учет домашних заготовок. Изначально система настраивается для хранения информации о закатках (наименование, состав, дата закатки, срок хранения). Пользователи регистрируются и начинают вести учет, но в процессе эксплуатации становится очевидным, что необходима добавленная информация о месте хранения в погребе. Такую настройку можно будет произвести без изменения исходного кода. С аналогичной системой можно будет работать для учета инструментов, где также потребуется задать новые сущности и поля.

Таким образом, возник вопрос: как наилучшим образом организовать работу с базой данных для обеспечения такой функциональности? В настоящее время у меня есть несколько рассматриваемых вариантов:

1. Классический подход с использованием реляционной СУБД, где создаются сущности "Объект хранения", "Свойства объекта", а также определяются необходимые связи.
2. Разработка специализированного фреймворка для работы с данными на базе реляционной СУБД, который будет изменять структуру базы данных при редактировании сущностей через админку (подобную реализацию я наблюдал в EspoCrm).
3. Решение на базе MongoDB (на данный момент только это в разработке). 

Какой из этих подходов вы считаете наиболее подходящим для реализации описанной функциональности?
  • 11 ноября 2024 г. 9:33
Ответы на вопрос 3
Для вашей задачи, связанной с разработкой многопользовательской системы учета с возможностью динамической настройки структуры данных, каждый из предложенных подходов имеет свои преимущества и недостатки. Давайте рассмотрим их подробнее:

### 1. Классический подход с использованием реляционной СУБД
**Преимущества:**
- Хорошая поддержка ACID принципов (атомарность, согласованность, изолированность, надежность).
- Сложные запросы и возможности анализа данных с помощью SQL.
- Поддержка транзакций.

**Недостатки:**
- Менее гибкий в плане динамического изменения структуры данных (например, добавление новых полей).
- Потребуется создание системы миграции, если необходимо модифицировать структуру таблиц.

### 2. Специализированный фреймворк для работы с реляционной СУБД
**Преимущества:**
- Позволяет создать адаптивную структуру базы данных.
- Вы можете реализовать интерфейс для управления структурами (и даже создавать строители запросов для создания/изменения сущностей).
- Можно использовать ORM (Object-Relational Mapping) для упрощения работы с данными.

**Недостатки:**
- Миграции могут быть усложнены.
- Потребуется больше времени на разработку фреймворка и его поддержку.

### 3. Решение на базе MongoDB
**Преимущества:**
- Высокая гибкость структуры данных (вы можете динамически добавлять новые поля без изменения схемы).
- Поддержка сложных документов и вложенных структур.
- Хорошо подходит для быстро меняющихся данных и непрогнозируемых требований.

**Недостатки:**
- Меньшая поддержка транзакций (требуется использовать специальные подходы для это).
- Потенциальные сложности с построением сложных запросов, если структура данных становится запутанной.
- Отсутствие явных связей между документами, что может привести к избыточности данных.

### Рекомендации
Для вашей системы, учитывающей необходимость динамической настройки, вероятно, наиболее подходящим будет использование **MongoDB** (3-й вариант). Меняя структуру данных и добавляя новые поля, вы сможете сделать это без сложных миграций, что значительно упростит работу администраторов и пользователей. 

Если ваши требования к целостности данных не слишком жесткие и вы не ожидаете сложных транзакций (например, несколько операций, связанных между собой), MongoDB сможет эффективно поддерживать ваши требования.

Однако, если вы предпочитаете реляционную модель и предполагаете, что пользователи все же будут сильно зависеть от констатации целостности данных, может быть целесообразным рассмотреть создание **специализированного фреймворка** (2-й вариант) для работы с реляционной СУБД. Это обеспечит нужную гибкость и позволит вам создать функционал для динамического изменения структуры, тем самым минимизируя время настройки.

В конечном счете, выбор подхода зависит от конкретных требований проекта и ваших предпочтений в архитектуре, опыта разработки и поддерживаемых технологий.
Есть EAV у которого начиная с определенного количества товаров, возникает проблема со скоростью. Обычно его берут как основу, но делают компромиссный вариант, например денормализация базы с использованием jsonb в postgresql
Посмотрите реализацию конструктора супер-типа, например, в CMS Modx - Migx. 
Из коробки он делает именно то, что вы хотите. Администратор создает новый тип, который может включать несколько свойств, а может еще быть свойства-списки, причем, тоже кастомного типа.
Единственная проблема Migx - нужно учиться понимать концепцию этого конструктора и определенное время на обучение созданию структур. Он не имеет интуитивно понятный интерфейс, вы тоже не сделаете интерфейс лучше.
Похожие вопросы