Управление справочными данными БД и их кодами - PullRequest
3 голосов
/ 13 февраля 2009

Справочные данные, или справочные таблицы, такие как CustomerType, ProductType и так далее. Они изменяются нечасто, иногда добавляется новый тип или удаляется старый. В коде они часто воспроизводятся как перечисления / константы, а также используются для заполнения полей со списком. Добавление нового Типа не должно нарушать существующие приложения, и чаще всего эти новые типы требуются только для поддержки функции нового приложения, устаревшие приложения должны игнорировать это.

Эта ситуация будет знакома большинству разработчиков, через несколько лет / месяцев она будет грязной, неконтролируемой и, если БД и код выйдут из строя, произойдут плохие вещи.

Как другие решают эту проблему? Как выглядит код / ​​БД и как он работает?

Ответы [ 2 ]

2 голосов
/ 13 февраля 2009

Вы имеете в виду, что идентификаторы и метки жестко закодированы в коде, и также появляются в справочной таблице в базе данных?

Подход, который мы выбрали, состоит в том, чтобы считывать идентификаторы и метки 'type' из базы данных и использовать их для заполнения списков.

(К счастью) Мне не приходилось поддерживать разные версии приложения, которым нужно считывать разные наборы значений из одной и той же справочной таблицы.

Я слышал, что люди присваивают минимальные идентификаторы версий значениям таблицы поиска. Приложение передает свою версию (возможно, 1.5) и извлекает все искомые значения с версией 1.5 или ниже. Значения поиска, добавленные для более поздней версии приложения (например, 2.1), будут игнорироваться.

Это, очевидно, приводит к значительным накладным расходам на обслуживание.

1 голос
/ 05 июня 2013

Мы создали собственный инструмент, который выполняет запросы, указанные в одном или нескольких файлах во время сборки, и генерирует классы перечислимых типов, по одному для каждой таблицы справочных данных. Как минимум, инструмент требует, чтобы справочные таблицы данных имели только два столбца: первичный ключ (с уникальными ограничениями) и строку. У каждого экземпляра enum есть имя, сгенерированное из строки (после того, как он был преобразован в алгоритм преобразования имени в верхний регистр, замены пробелов и других недопустимых символов в подчеркивания и т. Д.).

Инструмент достаточно гибкий, чтобы учесть дополнительные свойства для каждого значения; например, «отображаемое имя», «описание», могут быть связанные числовые значения и другие простые типы. Мы также генерируем статические методы в классе enum для получения различных подмножеств значений; всегда есть хотя бы одно, которое возвращает все значения, но у нас могут быть дополнительные значения, сгенерированные на основе запросов SQL. Например, для перечисления цветов у нас может быть статический метод «primaryColors ()». Дополнительные статические методы создаются для поиска значения на основе его ключа; например.,

public static Color valueOf(int key);

Перечисления позволяют легко и удобно читать общеизвестные ссылочные значения в коде; например.,

if (selectedColor == Colors.RED) {
   .
   .
   .

}

Это имеет недостаток, заключающийся в необходимости дополнительного шага сборки, но в нашем случае это значительно перевешивает преимущества: более чистый код, гарантия того, что пользовательский интерфейс, бизнес-логика и допустимые значения базы данных синхронизированы и т. Д.

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

...