powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Перечисления
7 сообщений из 7, страница 1 из 1
Перечисления
    #37076575
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К примеру, в ДБ имеется сущность Applications. Эта сущность имеет свойство Decision, которое может принимать фиксированный набор значений - Arroved, Cancel и Declined.
Этот набор значений лежит в своей таблице которая может иметь вид DecisionTypes(ID int, Description varchar(50)). Имеется соответствующий FK на таблицу Applications

Нужно реализовать функцию типа ApproveApplication(appNumber). Вот как ее реализовать без хардкодинга либо ID либо названия решения?
Т.е. будет получаться что-то типа

Код: plaintext
UPDATE Applications set Decision =  1  where AppNumber = @appNumber

Eдиница получается расползется по коду разнообразных ХП. По сути, с тем-же успехом можно напрямую везде вписывать слово "Approve".
Как этого избежать и вообще возможно-ли?
...
Рейтинг: 0 / 0
Перечисления
    #37076600
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford Как этого избежать и вообще возможно-ли?Боюсь совсем избежать хардкодинга не получится.
В одном из проектов таблица DecisionTypes имела поле Code int not null unique которое было определено в приложении как именованная константа cnstApprove и была видима пользователям в отличие от ID. То есть код был как короткое имя величины которая может быть безболезненно переименована.
...
Рейтинг: 0 / 0
Перечисления
    #37076680
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfordКак этого избежать и вообще возможно-ли?
Если оторваться от БД и подумать глобально, то способов избежать "хардкодинга вообще" при сохранении той же бизнес-логики не существует, существуют лишь способы заменить неудобный хардкодинг (например, единицу) более удобным (например, константой appApproved). Удобный хардкодинг имеет несколько отличительных особенностей: компилятор ловит синтаксические ошибки, лексема имеет легко читаемый вид, простые модификации легко осуществляются в небольшом количестве ясных по коду мест, идеально - в одном месте.

В БД универсальный способ, отвечающий этим требованиям - использовать хранимки наподобие SetApplicationApproved, то есть по сути закодировать константы в названиях ХП. Также можно использовать [updateable] view с полями типа status_approved, status_declined etc. Кроме того, конкретные СУБД могут иметь специфические способы решения той же задачи. Итого - решения в принципе есть, но не факт, что лучше, чем уместный "прямой" хардкодинг.

Например, в одной из своих разработок я поступил следующим образом: завёл пакет с константами (Oracle) и использовал их в серверном коде; в запросах же, приходящих с клиента, компонент запроса ловил фрагменты вида where status = &approved и подставлял туда распарсенное значение константы из пакета.

Но в любом случае, это лишний повод подумать о том, чтобы изменить бизнес-логику с целью отказа от хардкодинга, и вместо чётко заложенной модели смены статусов предусмотреть более универсальную конфигурацию.
...
Рейтинг: 0 / 0
Перечисления
    #37076939
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Абсолютно все (даже маленькие) справочники хранить в БД.
Никаких проблем с использованием в сторонних решениях (например репортеры, прочие системы) не будет.

При этом никто не мешает их кешировать локально, чтоб каждый раз не подчитывать приложением.
...
Рейтинг: 0 / 0
Перечисления
    #37077020
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVАбсолютно все (даже маленькие) справочники хранить в БД.
Никаких проблем с использованием в сторонних решениях (например репортеры, прочие системы) не будет.

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

Как уже сказал softwarer, это неизбежно, вопрос только в том, как сделать хардкодинг правильным.
...
Рейтинг: 0 / 0
Перечисления
    #37077252
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Другое дело что "Например, в одной из своих разработок я поступил следующим образом: завёл пакет с константами (Oracle) и использовал их в серверном коде" так явно то не в plsql это не прокатит. Надо будет как-то с контекстами заморачиваться или с другим способом передачи константы в sql.
...
Рейтинг: 0 / 0
Перечисления
    #37080729
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerсуществуют лишь способы заменить неудобный хардкодинг (например, единицу) более удобным (например, константой appApproved).
...
Но в любом случае, это лишний повод подумать о том, чтобы изменить бизнес-логику с целью отказа от хардкодинга, и вместо чётко заложенной модели смены статусов предусмотреть более универсальную конфигурацию.
да, make sense..

a что, есть методы отказа от перечислений? Ведь вообще-то они довольно много где используются, скажем права доступа для пользователя (full_access, view_access, none_access), стадии обработки какого-либо документа (на стадии обработки конструкторами, технологами, нормировщиками). Мне так кажется, что довольно много бизнес процессов завязано на логике типа "если документ такой-то, то отправляем его к технологам, иначе к нормировщикам". Тип обьекта вроде как менять нелогично (если документ у технологов - это тот-же документ что будет и у нормировщиков, если application было одобрено - все равно это то-же самое application что если-бы было отклонено). Т.е. вроде как переносить запись в таблицу "Одобрено" вместо смены одного аттрибута как-то совсем нелогично, а уж если у сущности несколько таких аттрибутов...
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Перечисления
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]