Java 1.5: Лучшая практика, чтобы сохранить константы для имени столбца таблиц БД? - PullRequest
6 голосов
/ 17 декабря 2010

Технология: - Java 1.5 или 1.6 - Hibernate 3.4

Чтобы избежать обновления имени столбца в нескольких местах при изменении имени столбца или таблицы, я хочу иметь постоянный файл для одного и того же.

У меня есть следующие запросы?

  • Одним из возможных решений является сохранение одного глобального файла, в котором хранятся константы для имен столбцов всех таблиц в базе данных.как

    class DbConstants
    {
            public static final String EMPLOYEE__PERFORMANCE_DESC="performance_desc";        
    } 
    

В приведенном выше случае сотрудники - это имя таблицы, а performance_desc - это имя столбца.Таким образом, вид формата tablename__columnname используется для именования константы, чтобы избежать коллизии между двумя константами двух разных таблиц, если у обеих есть имя столбца.

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

  • Предположим, если я изменю имя столбца в вышеприведенном примере с performance_desc на достижений_desc.В этом случае очень вероятно, что мне также захочется изменить константу, т.е. с EMPLOYEE__PERFORMANCE_DESC на EMPLOYEE__ACHIEVEMENT_DESC.Так как в этом случае мне нужно было изменить и имя столбца, и имя константы, я не вижу большого смысла использовать константу вместо имени столбца непосредственно в моем коде, хотя есть одно преимущество, что при изменении имени константы я могу использовать рефракцию для отражения константыимя изменить имя везде, где есть ссылки.Кажется, либо использование констант не слишком широко, либо я использую это неправильно.

  • В коде проекта мне кажется, что люди определяют один класс для каждого списка столбцов таблицы, чтобы определить константы какпоказано ниже.

    public class tbl_Employee
    {
            public static final PERFORMANCE_DESC=performance_desc;
    }    
    

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

  • Прочтите кое-что о Enum со строкой значения, а не с int, не уверен, чтоон доступен в Java 1.5 или 1.6, и если его целесообразно использовать в данном сценарии.

  • Каков наилучший метод для определения констант дБ?

  • Действительно ли полезно использовать константы БД?

  • Если я использую один класс для каждой таблицы, как упомянуто выше, одной проблемой, с которой я сталкиваюсь, является соглашение об именовании.Каким должно быть отношение между именем таблицы и именем соответствующего класса, которые определяют константы для столбцов таблицы.

  • Выше приведены случаи только для имен столбцов, а не имени таблицы.Я могу использовать константу, а не имя таблицы, в коде, так что следует использовать для определения констант для имен таблиц.

  • Часто утверждается, что имя таблицы и имена столбцов не сильно меняются после выпуска продукта или связанной версии.Изменения в имени таблицы и имени столбца происходят в основном на этапе разработки или улучшения функции (новая версия).Это сильный аргумент, чтобы избежать использования констант для имен таблиц или столбцов?

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

Ответы [ 5 ]

7 голосов
/ 17 декабря 2010

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

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

  • они не будут часто меняться, или, по крайней мере, они не должны быть

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

Я видел подобные файлы БД с тысячами констант, включая пользовательские запросы, части запросов и т. Д. И т. Д. (Даже драгоценный камень типа public static final String COMMA=",";, чтобы позаботиться о том, что написание запятых в будущее). На этом этапе они превращаются в строки «использовать один раз», и никто не осмеливается их менять.

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

2 голосов
/ 17 декабря 2010

Рассматривали ли вы использование Entity Mapping Framework (например, Hibernate)?

Может хранить всю информацию таблицы базы данных (а также всю другую информацию, относящуюся к БД) в файле конфигурации. Он также предлагает разделительный слой между «жестким» дизайном БД и вашим приложением (что облегчит восприятие изменений любым из них).

1 голос
/ 17 декабря 2010

В моем текущем проекте мы интенсивно используем аннотации для многих метаданных, связанных с БД, потому что мы не можем использовать такую ​​среду, как Hibernate. Для фактических констант столбцов, да, мы используем проверенный и истинный public static final String. И да, он довольно хрупкий.

1 голос
/ 17 декабря 2010

Вы можете создать интерфейс, который определяет константы.

Вот хороший пример в Android . Ищите интерфейс DataColumns.

0 голосов
/ 17 декабря 2010

Когда у меня есть метаданные о базе данных, я бы также сохранял их в базе данных. Вот как я видел, как работает другая система, если не изначально, то в конце концов. Чтобы обеспечить сохранение этих данных, вы можете проверить схему базы данных.

...