Два вопроса по проектированию БД

Имеется БД mysql для админки в компании. Есть пара вопросов по её усовершенствованию.

1. Нормально ли, что для каждого простого списка (список офисов, список складов, список поставщиков и тп) нужна своя отдельная таблица? А то есть желание объединить все одну таблицу ”Списки“ (будет спец-поле, например, "type", определяющее, к какому списку относится запись), но мешает боязнь того что простой список может вдруг обзавестись дополнительным полем и стать "сложней" других.

2. Есть список заказов на обслуживание. У заказа тонна простых параметров, плюс сложные параметры, типа списка запчастей, где каждая запись тоже состоит из нескольких полей. Причем, всегда нужно знать кто из менеджеров и когда изменил какой либо параметр в заказе (например: добавил/удалил запчасть, изменил имя клиента, добавил дополнительный номер телефона клиента). Также у заказа есть статусы (готов, в работе, принят и т.п.) и нужно уметь фильтровать список заказов по их истории - например, нужно знать какие заказы были переведены в работу 2 дня назад и завершены вчера.

Сейчас простые параметры в заказе реализованы не как поля в таблице "Заказы", а как записи в отдельной таблице "Параметры заказов" с полями "ID заказа"/"Имя параметра"/"Значение параметра"/"Состояние параметра". При обновлении параметра, старому в состояние прописывается, что он удален, и добавляется новая запись. Некоторых параметров может быть несколько активных сразу (например, несколько номеров клиентов).
Это правильное решение? Или нужно было все одиночные параметры скинуть в отдельные поля таблицы "Заказы", а для множественные параметры раскидать по отдельным таблицам? И как тогда лучше всего следить за историей обновления Заказа? И как лучше делать фильтр по старым (измененным) параметрам?
  • Вопрос задан
  • 2787 просмотров
Пригласить эксперта
Ответы на вопрос 4
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
1. Да, это называется "нормализация". Для приведенного вами случая - да, это должны быть разные таблицы. Правда есть еще single table inheritance, что удобно использовать если у вас есть несколько типов записей, которые должны выводиться одним списком (например). То есть, если говорить в ОО стиле, у вас есть базовый абстрактный класс, и несколько наследников. У каждого наследника свои поля, но в базе это все хранится как одна большая таблица и одно поле, разделяющее типы.

2. Тут сложно ответить наверняка, но все опять же упирается в нормализацию. Для хранения параметров существуют паттерны типа EAV (Entity-Attribute-Value)
Ответ написан
1. Да, нормально. Хотя в последних версиях MySQL, текущий вариант с выбором типа записи, будет работать точно также.
2. Думая, что надо разделить логику на текущее положение заказа и историю изменений.
Ответ написан
Да, ваше решение считаю верным. Потом если что объединять запросы в JOIN`ы
Ответ написан
Комментировать
но мешает боязнь того что простой список может вдруг обзавестись дополнительным полем и стать "сложней" других.

В таких случаях отличным вариантом будет использование NoSQL-решений. MongoDB к примеру.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы