2014-09-15 3 views
4

У меня есть приложение Java, которое использует класс «Страна». Бизнес-логика связывает каждую страну мира:Использование перечисления в Java в качестве альтернативы небольшой базе данных

  1. Код iso.
  2. Телефонный код страны вызова
  3. список часового пояса базы данных TZ Идентификаторы подходит для этой страны

Обычно это данные идеально подходит для базы данных. Однако, учитывая тот факт, что эти данные довольно стабильны (конечно, время от времени оно меняется, но обычно оно не используется для выполнения операций создания/обновления/удаления в этих записях). Я думал о том, чтобы помещать информацию в список, например это:

public enum Country 
{ 

    US(1,new String[]{"America\New York","America\California",...}), 

    ... 

    NL(31, new String[]{"Europe\Amsterdam"}); 

    ... 

    public Country(int telephoneCode, String[] timezoneIds) 
    { 
     ... 
    } 
} 

Возможные преимущества такого подхода:

  1. данных непосредственно из источника подъезд кода Java, так что нет никакой задержки с выполнением запросов к базе данных.
  2. Нет необходимости в настройке и обслуживании файла базы данных где-то (что это большое дело для меня, потому что я не знаком с JDBC еще)

Недостатки могут быть:

  1. Данные скрыты внутри исходного кода и не обновляются автоматически, если политика меняется.
  2. Код должен быть перераспределен при изменении перечислений. (См. this question.) .) .
  3. Насколько хорошо производительность «больших» перечислений (более 200 возможных значений) по сравнению с запросами базы данных для получения конкретной информации?

Я хотел бы задать вопрос по смещенному вопросу (недостаток № 3), но любые комментарии относительно более широкой картины приветствуются.

Я знаю класс Locale в java, который можно использовать для получения списка всех возможных стран, известных в java-системе. К сожалению, информация о телефоне и часовом поясе недоступна. Мое намерение слишком объединить эти данные в одно перечисление. Является ли эта практика признанной правдоподобной альтернативой или хакерством?

+2

Если у вас есть перечисление, но вы никогда не использовать константы в исходном коде, е у него запах кода. Это похоже на данные, которые должны находиться в базе данных. Слишком рано беспокоиться о производительности без реальных тестов, но если все остальное не удается, вы всегда можете кэшировать весь набор данных. – biziclop

+3

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

+2

В дополнение к комментарию JB, даже если у вас были эти данные в БД, было бы предпочтительнее кэшировать их один раз в памяти и обращаться к ним за раз в кеш. – A4L

ответ

3

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

Возможно, это зависит от того, кто использует программное обеспечение (личное использование или крупную компанию), но я бы сказал, что самая большая проблема здесь - это №2, а не № 3. В коде и в базе данных должно быть определено, на основании того, кто может изменить значения позже. Вы действительно в порядке, что вам нужен разработчик, чтобы изменить стоимость, перекомпилировать все и развернуть новую версию или патч программного обеспечения? Небольшое исправление в базе данных или скрипте для обновления стран будет намного проще.

Если это персональный проект, этот аргумент, вероятно, не имеет значения для вас. Я бы по-прежнему рекомендовал использовать базу данных - только для обучения. Вам не нужно настраивать огромную систему баз данных, такую ​​как MySQL. Вы можете использовать небольшую встраиваемую базу данных, такую ​​как h2 или Apache Derby.


Просто для справки, как часто коды стран и названия могут меняться:

ISO 3611-1 (который определяет язык и коды стран для существующих стран) has been changed 17 times since 2007. Это примерно 2,4 раза в год.

1

Нет проблем с созданием Enum: вообще говоря, это редкая смена стран.

Мои предложения:

  1. Использование Enum
  2. хранить данные на Db и элементы нагрузки во время инициализации (статический кэш)
  3. использовать как попало кэш (JCS, EHCache ...)
  4. использовать Resource Bundle
+1

реализация пользовательского (или нет) Resource Bundle - лучший ответ для меня ... – giusy