Задать вопрос
@sepetov
Программист Navision, программист PHP

Как уменьшить количество таблиц-справочников с тремя-четырьмя строками?

Наример:
  1. Есть таблица "Заказы". Многие поля таблицы - это внешние ключи на иные таблицы.
  2. Эти "иные таблицы" чаще всего имеют по 3-4 (иногда больше) строчки вида "ключ-значение"
  3. Все эти микроскопические таблицы-справочники весьма постоянны или вообще ни разу не менялись.

Проблема: подобных справочников в текущей БД гораздо больше, чем таблиц, для обслуживания которых они создавались.
Вопрос: как вы храните подобные связанные данные? Как это стоит делать, а как - нет?

Сейчас же получается зоопарк вспомогательных таблиц, когда основных таблиц - десятка полтора, а справочников - за сотню. Кому интересно, то для таблицы заказов, например, могут быть такие справочники:
  1. Статусы заказа (открыт/выпущен/закрыт и т. п.)
  2. Статусы сборки заказа (ожидает сборки, сборка начата, сборка проверена, сборка завершена)
  3. Формула оплаты заказа (тут много вариантов)
  4. Фонд оплаты (собственные средства, федеральный бюджет, территориальный и т. п.))
  5. Внутренний клиент (одно из возможных внутренних ООО)
  6. Ответственный сотрудник
  7. Территориальный сектор
  8. Направление
  9. ...и ещё 15 таблиц


Итог на основании полученных ответов:
  • В одном проекте оставляем как есть - ну и пусть, что так много таблиц.
  • В другом проекте перейдём на тип данных enum.

Всем спасибо!
  • Вопрос задан
  • 297 просмотров
Подписаться 3 Простой 5 комментариев
Решения вопроса 2
@rPman
тут несколько подходов, я трогал каждый из них и все они имеют право на существования
1. оставь как есть, я рекомендую, пусть будет 100500 таблиц справочников (если проблем с именами нет ну и отлично), fk-индексы все это свяжут а инструменты анализа базы данных помогут с этим работать (автоматические query builder с мышевозекательным интерфейсом) и база будет сама следить за тем что идентификаторы справочников не противоречивы
недостатков я не могу придумать, кроме может быть сильно разросшейся структуры, когда то давно я слышал что некоторые базы данных при увеличении количества таблиц начинают хуже работать но как я понимаю это если их будет десятки тысяч а не десятки и сотни.. может быть резервное копирование такой базы или ее репликация будет проходить чуть медленнее или еще хуже, организационно репликация может быть настроена на не рассылку ddl модификаций, в этом случае создание нового справочника будет задавать работу еще и админам, что нежелательно.

2. противоположный, использование одной таблицы key-value для нескольких разнородных справочников (id, value, table_name), в 99% случаев можно использовать один сиквенс (одну последовательность идентификаторов), вам же не обязательно чтобы разные справочники начинали счет своих строк с одного и того же числа 1.
Недостаток - база данных теперь не сможет контролировать что вы используете непротиворечивый идентификатор (можно в запись одного справочника указать номер из другого), хотя несуществующий так же нельзя будет указать (и будут работать delete cascade), так же удобной автогенерации sql не будет. Структура будет проще, так же интерфейс редактирования таких справочников может быть один вместо кучи форм и добавлять новые справочники будет сильно проще (хотя с точки зрения разработки нет особой разницы, один insert ты написал или create table перед этим)

3. не хранить справочники в базе данных вообще, т.е. за значение справочников отвечает бакэнд (хранятся в статичных файлах или в коде) самый дибильный подход, редактировать такие справочники скорее всего только руками в конфигах/исходниках. Недостатки - база данных совсем не будет знать ничего о значениях и не сможет ни проконтролировать ни помочь с запросами
Но это позволит снять немного нагрузки с базы данных, сделает структуру проще и позволит перенести управление значениями справочников на откуп ide редактора (если хранить значения справочников в коде, можно дать значениям имена переменных, так как в коде часто их так или иначе заводить придется)

Лично я третьим подходом в чистом виде не пользовался, но у меня был набор скриптов, которые из справочников в базе данных формировали код с инициализацией констант и их именами для приложения (сами справочники приложением редактироваться не могли) и был соблазн перевести эту часть базы из 'оперативной' в 'для разработчика', так как справочник это что то - отвечающее за отображение информации, но не за бизнеспроцессы (ну примерно как языковые файлы для приложения, не хранить же переводы строк интерфейса тоже в базе, ну так и справочники смогут работать как часть этого интерйфейса и тоже может требовать перевода).
Ответ написан
Для коротких списков есть тип данных: ENUM.
Поддерживается, например, в MySQL, Postgres.

Идеально подойдёт для:

  1. Статусы заказа (открыт/выпущен/закрыт и т. п.)
  2. Статусы сборки заказа (ожидает сборки, сборка начата, сборка проверена, сборка завершена)
  3. Формула оплаты заказа (тут много вариантов)
  4. Фонд оплаты (собственные средства, федеральный бюджет, территориальный и т. п.))
  5. Внутренний клиент (одно из возможных внутренних ООО)
  6. Ответственный сотрудник
  7. Территориальный сектор
  8. Направление

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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