Согласно Пять простых ошибок проектирования баз данных, которые вы должны избегать Анита Сена, используя таблицу общего поиска сохранение возможных статусов для объекта является распространенной ошибкой.
Редактировать + Ответить: Цифры в статье Анита не очень хорошо помечены - я думал, что оба Рисунок 1 и Рисунок 2 являются примерами плохой дизайн, тогда как рисунок 2 - хороший дизайн. Фу, немного волновался.
Вкратце:
- Таблицы поиска: хорошо.
- Таблицы Common-lookup: bad.
Я буду держать мой вопрос ниже для справки.
Приведены следующие причины:
"Вы теряете средства для обеспечения точного данные; ограничения. Объединив разные объекты в единый таблицы, у вас нет декларативных средств для ограничения значений определенного категория."
Как сдерживающие значения теряют точность?"Вы вынуждены представлять каждый тип данных в виде строки с этим тип общей таблицы поиска."
Если я хочу представить другой тип данных, я могу добавить столбец для него в мою таблицу поиска."Вы обязуетесь жесткости и последующей сложности".
Как?В-четвертых, наконец, вы столкнулись с физической реализацией вопросы.
Я не понимаю, почему.
Я не согласен с большинством приведенных причин и хотел бы, чтобы какая-то объективная критика о моем неправильном? логика.
Мои примеры:
Ссылаясь на пример работы в ремонтной службе со многими возможными состояниями, которые обычно имеют естественный поток, возьмите таблицу JobStatus
:
- Забронировано
- Назначено технику
- Проблема диагностики
- Ожидание подтверждения клиента
- Отремонтировано и готово к отправке.
- Отремонтировано и курьерское
- Неправильно и готово к отправке.
- Отклонено предложение
Возможно, некоторые из этих статусов могут быть нормализованы к таблицам типа Couriered Items
, Completed Jobs
и Quotes
(с состояниями Pending/Accepted/Rejected), но это похоже на ненужное осложнение схемы.
Другим распространенным примером может быть таблица OrderStatus
, чтобы ограничить статус заказа:
- В ожидании
- Завершена
- Высылаем
- Отменено
- Возвращено
Заголовки и описания статуса находятся в одном месте для редактирования и легко поддаются поиску как выпадающий список с внешним ключом для приложений динамических данных. Это хорошо сработало для меня в прошлом. Если бизнес-правила диктуют создание нового статуса заказа, я могу просто добавить его в таблицу OrderStatus
, не перестраивая свой код.
Почему эта плохая практика?
Редактирование: Я добавил причину Анита к моему вопросу и попытался оставаться объективным.
-