Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Оптимизация работы со справочными локализованными данными / 15 сообщений из 15, страница 1 из 1
24.09.2012, 23:52:15
    #37970653
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация работы со справочными локализованными данными
Чтобы не было двоякой трактовки - "справочные данные" - это статические данные, описывающие некое свойство сущности, так называемые "словари" - например, у меня это для сущности Пользователь - страна проживания, используемые языки, валюта использования и т.д., то есть данные, внесенные в БД (или другое хранилище) заведомо имеющие ограниченную длину и не подлежащие редактированию.
"Локализованные" - на N-ном количестве языков интерфейса.

Веб-проект. Spring (framework, MVC, Security). Hibernate.

Ранее в проекта всегда не парился с этим понятием и использовал отдельные таблицы в БД. Причем, для каждого языка создавал дополнительное поле (редактировал сущность), а изымал в основном, используя либо параметризованные запросы к БД с указанием требуемого поля, либо (значительн реже) - рефлексию для объекта-сущности. Пример Location:
idisotitle_entitle_frtitle_ru1usUSAUSAСША2caCanadaCanadaКанада
Ну, а дальше ссылался на идентефикатор - таблицы связывались.

Если количество языков заведомо неизвестно (планируется добавление и даже динамическое добавление), то в таблице можно оставить только iso (если ссылаться на пример), а в файлах с локализованными метками (xxxxx_en.properties, xxxxx_fr.properties) указывать название, типа location.us=USA, location.ca=Canada и т.д. Это как бы делает гибче работу с языками.

Однако мне очень не нравится черезчур активное использование БД для таких второстепенных задач: во-первых, обеспечивая целостность, приходится постоянно "дергать" зависимые таблицы. Вроде ерунда, но иногда так получается, что изымается сущность, у нее 2 зависимых таблицы с динамическим содержанием, а с ними - до десятка справочных! И при этом использование этих второстепенных данных фактически сводится к минимуму, так как для отображения/редактирования на клиенте на этот клиент отсылаются (или заполняется шаблон - тут это неважно) все эти справочники целиком, затем объект и еще проводится некая работа на клиенте для отображения соответствия справочным данным (из нашего примеру, отобразить страну пользователя в выпадающем списке всех стран). Я надеюсь, что смысл недовольства, который я хочу донести, понятен. Логичнее было бы вместо ссылки на идентефикатор из таблицы стран просто указать "us" (уникальный указатель), передать на клиент список стран, который уже хранится (память, диск) и также отобразить. Особо ни целостность, ни некие теоретические коллизии, не интересуют в рамках рассматриваемых проектов.

Для хранения данных, которые подразумевается динамически отображать на клиенте (скажем, по ajax-запросу), удобно было бы хранить уже готовый JSON в пропертях, типа такого:
location.list=[{"key":"us","val":"USA"},{"key":"ca","val":"Canada"}]
Как мне кажется, преимуществ по скорости уйма - крайне гибкая работа с локалями, максимально эффективная работа с данными для динамического запроса с клиента, так как содержимое пропертей "висит" в памяти, берется и отсылается уже в готовом виде. Так как известно, что такие "справочники" относительно небольшие - десяток-полтора с максимальным количеством до сотни, то памяти используется мизер.

Но! Я пока не вижу явных подводных камней, но интуиция мне говорит, что где-то есть подвох и я могу разочароваться в таком механизме. Так как я явно его не вижу, то хочу спросить - существует ли "правильное" использование справочных локализованных данных при описанных условиях?
Второе - я подключаю пропертиз в конфиге Спринга как-то так:
Код: xml
1.
2.
3.
4.
5.
6.
	<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
		<property name="basename" value="classpath:messages"/>
		<property name="defaultEncoding" value="UTF-8"/>
		<property name="cacheSeconds" value="1"/>
		<property name="fallbackToSystemLocale" value="false"/>
 	</bean>


Файлы пропертей загружаются Спрингом при старте проекта. Если я хочу сделать динамическое изменение данных, то как обновить их в контексте Спринга, не перегружая проект? - Думаю, вопрос несложный, и наверняка найду несложное решение, но и вопрос, в принципе, второстепенный.

Из собственного опыта, какую вы используете архитектуру для работы со справочными данными?
...
Рейтинг: 0 / 0
25.09.2012, 05:33:01
    #37970735
пролетевший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация работы со справочными локализованными данными
ResourceBundle , в Спринге есть специальные средства для работы с ними. тынц
...
Рейтинг: 0 / 0
25.09.2012, 14:38:27
    #37971434
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация работы со справочными локализованными данными
Сразу видно, что вопрос ты не читал, потому что ссылка показывает обычную работу докализации, которая у меня реализована. И совершенно не отвечает на поставленный вопрос.
...
Рейтинг: 0 / 0
25.09.2012, 14:48:00
    #37971456
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация работы со справочными локализованными данными
...
Рейтинг: 0 / 0
25.09.2012, 17:01:22
    #37971738
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация работы со справочными локализованными данными
Да уж. Зря я второй вопрос задавал - он и не особо актуален, да и теоретически решаем достаточно просто - берем бин и заменяем в нем данные. Тут особо и придумывать не надо.

Основной, главный, превалирующий и т.д. вопрос - правильна ли техника, которую я применил с локализованными справочниками в пропертях? - А то придумать - придумал, но не уверен в правильности. Как говорил, чую, что будут подводные камни.
...
Рейтинг: 0 / 0
25.09.2012, 17:14:20
    #37971755
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация работы со справочными локализованными данными
Насколько я разбираюсь щас 90% апликейшенов всё равно кешируют справочники в памяти.
Тоесть будешь ты их хранить в БД или в JSon-ах не влияет никак на работу сервера. Другое
дело что старт аппликейшена будет несколько тяжелее.

И некоторые задачи с данными имеющими ярко выраженный реляционных характер (связь
1:1:1....1) в языковых свойствах всё таки удобно работать реляционно. Попытка разворачивать
их в файлы чревата денормализациями ошибками которые всё равно надо тестить и искать
в файлах а это - морока.
...
Рейтинг: 0 / 0
25.09.2012, 18:07:56
    #37971836
sanBez
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация работы со справочными локализованными данными
mayton,

+100
...
Рейтинг: 0 / 0
25.09.2012, 22:29:18
    #37972107
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация работы со справочными локализованными данными
Уже что-то. Сенкс.
...
Рейтинг: 0 / 0
26.09.2012, 08:00:45
    #37972317
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация работы со справочными локализованными данными
sanBezmayton,

+100+1
...
Рейтинг: 0 / 0
28.09.2012, 15:19:09
    #37976105
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация работы со справочными локализованными данными
Сначала принял стандартную - "реляционную" - модель как правильную, но опять наталкиваюсь на стену.

Суть вот в чем ... при уже ИМЕЮЩЕЙСЯ структуре, например, рассмотренной выше
idisotitle_entitle_frtitle_ru1usUSAUSAСША2caCanadaCanadaКанада
действительно - пользуйся не хочу.

Но если я хочу более-менее автоматизировать добавление нового языка к проекту (например, в админке)? Допустим, новое поле в таблице БД сделать не проблема, но класс-сущность, представляющий таблицу, я уже не изменю, и полноценный HQL-запрос не сделаю. Переходить чисто на использование SQL однозначно не хочу. А Иначе как?

Конечно, могу сделать действительно универсальную структуру, когда отдельно есть таблица языков, а таблицы справочников представляют собой вместо набора полей для каждого языка одно поле с текстом, а другой - со ссылкой на язык. И выборка соответствующая - "взять значения для указанного языка, если нет, базовый (или рейтинг используемости языка)". Я такое уже делал. Универсальность, конечно, впечатляющая, но это перебор - для получения подобной инфы нужно или несколько запросов, или один, но длина его до тысячи и свыше символов - тоже лишняя нагрузка на БД. Так что избыточная универсальность ни к чему. Хотя, возможно, в некотором роде это стандарт.
...
Рейтинг: 0 / 0
28.09.2012, 15:42:27
    #37976161
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация работы со справочными локализованными данными
под реляционной моделью имелось скорее всего в виду дочерняя таблица :
message_idlang_idmessagelabel.titleusUSAlabel.titleruСША
...
Рейтинг: 0 / 0
28.09.2012, 15:57:13
    #37976186
sanBez
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация работы со справочными локализованными данными
IDVsbruck,

Так как имеющаяся структура не нормализована, гемор при добавлении будет что в одном, что в другом случае.
И в чем сомнения если вы явно видите путь к нормальной реализации?
...
Рейтинг: 0 / 0
28.09.2012, 17:32:03
    #37976319
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация работы со справочными локализованными данными
Да не вижу, в том-то и дело ... так плохо - отсутствует динамика, делать универсально - гиморно, через пропертис - не вполне серьезно, да и работать с файловой системой минуя базу - несерьезно это (хотя, не скрою, быстро и удобно).

Что касается примера выше, представляющего "реляционную модель", то к такому варианту я не приходил - нормально ли это?
...
Рейтинг: 0 / 0
28.09.2012, 17:44:48
    #37976335
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация работы со справочными локализованными данными
IDVsbruck,

Пропертиз по-моему идеальный вариант. Их можно отдавать переводчику в виде файла, не предоставляя доступа к системе вообще.
А реляционная модель - тоже очень хорошо.
...
Рейтинг: 0 / 0
28.09.2012, 17:51:17
    #37976349
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация работы со справочными локализованными данными
Если файл - плоский. Ключ-значение. То и никаких XML и JSon-ов не надо. Properties с головой покрывают
задачи. Будьте проще. Make it simple... А от пропертей всегда сможете перейти к XML если будет надо.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Оптимизация работы со справочными локализованными данными / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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