|
|
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
Собственно. Заказчик просит прикрутить к уже работающему проекту мультиязычность контента. DataBase - Oracle 11g. Application GUI- Delphi. Структура справочников не сложная и почти однообразная 1. Primary Key 2. Аттрибуты 3. Поле для перевода 4. Возможно еще поле и т.д. На данный момент заказчик просит кроме базового языка добавить еще 2, но в преспективе их может быть больше. На ум приходили такие варианты реализации на уровне СУБД 1. Банально добавить поля с суффиксом языка(Field_Eng, Field_UKR). Просто в реализации но не предусматривает возможность расширения языков, в случае добавления языка нужно добавить во все таблицы по полю, переделать все вьюшки и подкоректировать все GUI модули. 2. Создать единый справочник в виде двух таблиц. В первой. Уникальный код Имя схемы Имя таблицы Имя поля Соответственно во второй Уникальный код Код языка Код PK Перевод Вроде красиво, но опять таки проблема делать вьюхи, нужно джоинить постоянно, и если в одной табличке более одного поля для перевода то нужно столько же джоинов. Ну в GUI можно сделать компонент который будет сам это контролировать, просто в таблице с описанием вьюшек и датасетов описать какое поле откуда берет перевод. При этом в мастер табличке поле с переводом держать имя в базовом языке. 3.В отдельной схеме, например, Lang хранить копии таблиц без атрибутов, только PK и поля которые могут быть с переводами во всех вариантах (F_Rus,F_Eng,F1_Rus,F1_Eng), а в мастер таблице вообще не хранить информации которая подлежит переводу. Можно дописать пакет который будет сам создавать все необходимые таблицы. 4. Совмещенный 2 и 3 вариант. В отдельной схеме таблички в которых PK Код языка Filed_1 Field_2 ... Ну и на последок еще и надо придумать универсальный интерфейс для всех модулей. Ваши предложения и идее. Буду очень признателен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2011, 18:37 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
Я за первый вариант. Что нибудь вроде переменной сессии, в зависимости от которой вычисляемое поле field (на которое смотрит gui) будет подставлятся из field_eng, field_rus. Правда надо будет подточить сохранение. Новый язык - новый патч на базу. Действие понятное, осязаемое. Второй хорошо подходит при бесконечном и постоянно растущем количестве языков и на мой взгляд не окупится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 08:45 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
SERG1257, Но при 3 языках которые уже нужны довольно громадная таблица выходит, например в одной табличке есть 5 полей, 5*(3+основной) уже дополнительно 20 полей. С другой стороны намного проще так как нет проблем при построении вьюшек и заборников данных, да и в отчете легче дернуть поле от переменной языка. Еще есть идеи или предложения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 10:02 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
"Прикрутить к работающему проекту" обычно означает довольно скромный бюджет. Поэтому с большой вероятностью я выбрал бы следующий вариант: в базе в "переводных" полях хранить что-нибудь типа <rus>Привет</rus><ukr>Здоровеньки булы</ukr><jew>שלום</jew>, а в приложении на уровне базовой формы/базового модуля вешать на dataset обработчик, скажем, AfterOpen, который отлавливает эти поля и вешает на них OnGetValue/OnSetValue, вытаскивающий/модифицирующий нужный язык. Плюсы решения: 1. Делается за пол-дня 2. Тривиально расширяется на любое количество языков 3. Язык легко переключается на ходу 4. Тривиально делается логика "если нет украинского перевода, используем русский" 5. Загрузка увеличивается только на траффик более длинных значений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 10:12 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
softwarer, В GUI понятно как отрабатывать, а как обрабатывать при построении View? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 10:13 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
MorAdanВ GUI понятно как отрабатывать, а как обрабатывать при построении View? А зачем там что-то обрабатывать? Какие есть view - пусть и работают. В них попадут такие композиты, и доберутся они до пользователя через тот же gui. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 10:15 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
softwarer, Ну это если все в GUI, а если строить отчеты например FastReport напрямую с вьшек то как то не очень понимаю как распарсить их. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 10:23 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
Если FastReport имеется в виду в приложении, то он точно так же опирается на dataset-ы. Да и собственные OnGetValue у него вроде бы есть. Если имеется в виду FastReport Server или как там его - не возился, не знаю. Возможно, таки придётся и в СУБД сделать функцию для парсинга таких многоязычных значений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 10:33 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
Возможно, что-то типа варианта 2 нуждается в рассмотрении, т.е. када по имени схемы, имени табицы, имени атрибута и первичному ключу и коду языка можно узнать значение - (строка на соответсвующем языке) из соотвествующих таблов. Но пробовать вычислять это значение типа с помощью ф-ии, а не джойнами. Типа ф-я, которая по вышеуканным атрибутам в качестве праметров из соотвествующих табла буит находить значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 10:35 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
vadiminfo, В случае если реализовывать функцией то сильно возрастет нагрузка на БД. Для каждого столбца и строки будет вызваться функция в которой каждый раз будет select. Довольно дорогое удовольствие, учитывая что в онлайне более 100-200 человек постоянно что то делают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 10:40 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
MorAdan, ну да это физический аспект, который может иметь драмматическое значение. Но логический аспект (простота извлечения данных и возможности расширения в рамках рел таблиц) делает, его, возможно, нуждающимся в рассмотрении. Поскоку кажется наиболее простым при некоторых условиях. Например, искать компромисы в плане основной язык и переводы, в надежде что большинство на основном языке и там без ф-ий все. Какие-то способы расчитанные на физические аспекты. Я имел в виду не законченное решение а отправную точку для дальнейшего. В общем случае вопрос стоит, насколько вообще подходят реляционные способы. И Логически и физичеки. Отказ от джойнов это уже отход от чистой реляционности. Возможно и дальнейший отказ. Например, какое-нить не совсем реляционное хранение, например не атомарное: для кажного атрибута сразу несколько значений на всех языках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 11:21 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
softwarer"Прикрутить к работающему проекту" обычно означает довольно скромный бюджет. Поэтому с большой вероятностью я выбрал бы следующий вариант: в базе в "переводных" полях хранить что-нибудь типа <rus>Привет</rus><ukr>Здоровеньки булы</ukr><jew>שלום</jew>, а в приложении на уровне базовой формы/базового модуля вешать на dataset обработчик, скажем, AfterOpen, который отлавливает эти поля и вешает на них OnGetValue/OnSetValue, вытаскивающий/модифицирующий нужный язык. Плюсы решения: 1. Делается за пол-дня 2. Тривиально расширяется на любое количество языков 3. Язык легко переключается на ходу 1. Да неужели !? 2. Как минимум придется увеличить длину строк. А если число языков будет расти, то надо постоянно удлинять. 3. А в отчетах ? Допустим это SQL-запрос из внешней программы. Это может быть и ОЛАР. Удобно только для обслуживания морд внутри приложения. Именно так сделано в Навижн. Но сами данные в базе не локализуются. ЗЫ: отдельное поле-идентификатор языка. Можно написать SQL-ф-ции извлечения нужного языка, типа GetTovarName(ID, LangID) и стараться извлекать через них. Тотальная переделка базы и процедур в БД. Очень неблагодарная работа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 12:28 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
LSV, Согласен с вами, какой вариант предложите вы, интересно как это реализовано с ERP системах, например SAP? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 12:31 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
LSV1. Да неужели !? Вы про то, что не мешало бы добавить слова "компетентным разработчиком"? Согласен, они подразумеваются. LSV2. Как минимум придется увеличить длину строк. А если число языков будет расти, то надо постоянно удлинять. И в чём проблема? Код: plaintext 1. 2. 3. 4. 5. Вот не говорите, что на выполнение этого потребуется минимум месяц LSV3. А в отчетах ? Допустим это SQL-запрос из внешней программы. Это может быть и ОЛАР. Я могу придумать ещё прорву случаев, не входящих в постановку задачи. Впрочем, я с удовольствием выслушаю Ваш вариант, и непременно спрошу, как он будет жить с ОЛАПом. Особенно меня будет интересовать выбор языка - что и как мне нажать в каком-нибудь стандартном олапе, том же Oracle BI, чтобы в отчётах волшебным образом сменился язык. LSVУдобно только для обслуживания морд внутри приложения. Ага. Что характерно, в постановке задачи именно это и требуется. Сначала возразим, потом прочитаем :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 13:01 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
softwarer, Хм... Думаю ваше решение можно сделать так: 1. Постоянно писать что то типа: Код: plaintext 1. 2. 3. 3. Вьюшки сделать контекстно зависимыми 4. Учитывая что это Oracle 11 то можно сразу в табличку добавлять виртуально вычисляемые поля на основании базового поля. Мину который я наблюдаю это ограниченная длина Varchar2(4000 байт, а для UTF8 это не 4000 символов), есть смысл смотреть в сторону BLOB. Вы знаете ваше решение, на самом деле очень красивое, если использовать контексты то во вюшках надо банально его юзать, ну и в пакетах по созданию и обновлению записей добавить авто форматирование текста для необходимого языка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 13:47 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
softwarer"Прикрутить к работающему проекту" обычно означает довольно скромный бюджет. А если финансирование нормальное, какой вариант Вы бы предпочли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 14:18 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
MorAdanПостоянно писать что то типа Постоянно писать что-то типа - это ненадёжное и недешёвое решение. Я бы рассматривал такое в последнюю очередь. MorAdanМину который я наблюдаю это ограниченная длина Varchar2(4000 байт, а для UTF8 это не 4000 символов), Вряд ли это существенно. Как-то так выходит, что по бизнес-логике требуются либо достаточно короткие строки (скажем, до 100 символов), либо потенциально неограниченные портянки-memo, которые если и сделали varchar2(4000), то переclobить будет ничем не плохо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 14:24 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
softwarerMorAdanПостоянно писать что то типа Постоянно писать что-то типа - это ненадёжное и недешёвое решение. Я бы рассматривал такое в последнюю очередь. Ну если сделать один универсальный пакет, то можно постоянно использовать его функции и процедуры. Довольно постоянное решение, и если что то менять в логике, то оно и весь бизнес процесс затронет тоже. А контекстноя выборка с Nvl всегда будет гарантировать что если отсутствует перевод то будет использован язык по умолчанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 14:27 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
MorAdanА если финансирование нормальное, какой вариант Вы бы предпочли? Тогда как следует изучил бы реализацию проекта и требования к многоязычности и думал бы. Просто как один из возможных вариантов: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Впрочем, и изложенный не стал бы упускать из виду :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 15:21 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
softwarer, Предыдущий мне как то больше нравиться, и легче с точки зрения докрутки к существующему, проблема в том что деньги есть времени нету :-). Пишется пакет который все это дело контролирует и потом проганяеться процедура на переделку всех необходимых полей и замену текста на маску. Однако спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 15:25 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
softwarerLSVУдобно только для обслуживания морд внутри приложения. Ага. Что характерно, в постановке задачи именно это и требуется. Сначала возразим, потом прочитаем :)Да ну ? Задача как раз и стоит в локализации контента (!) и обсуждения структуры таблиц, т.е. ГУИ-морды и данных в БД. Вся сложность именно в БД. Для ГУИ одно поле возможно самое оно. Как в ОЛАПе разруливать строку, в кот. языки отделены самодельными текстовыми тегами ? На самом деле весьма трудоемкая работа, если делать по уму, а не залипуху. Серьезная переделка должна коснуться буквально всего и ГУИ и БД. Везде должен фигурировать желаемый параметр. зы: предлагаю автору отказаться от этой затеи под любыми предлогами :) Это никто не оценит. Серьезно. Про ERP-системы, в кот. есть готовая локализация данных (не подписей в ГУИ) не слышал. Встречал только банальных два поля. Но это залипуха. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 16:37 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
LSV, 2 поля это полный фонарь. Насчет отказа тут еще подумать нужно, как ни крути а реализовывать нужно. Только надо определиться каким методом. То что предлагает softwarer, на самом деле просто внедряется. Опять таки все данные в софте вводятся через диалоги, они в свою очередь дергают процедуру из пакета, внутри GUI нету команд Insert или Update. Delete вообще отсутствует, все всегда храниться. Что переделать необходимые справочники, GUI даже дергать не нужно, дописываются по 1-2 строке в каждой процедуре по работе с тем или иным справочником, + переделываются вюхи на котекстно зависимый вариант. По прикидкам моих людей за неделю можно реализовать, учитывая что справочников несколько сотен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 16:44 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
MorAdan, Не зацикливайтесь на ГУИ. Что будете делать, когда понадобится внешние импорт/экспорт/ОЛАП, репортинг ? Если у вас международная система (в разных странах), то возможно следует сделать просто некую прогу-шлюз для синхронизации разноязыковых данных. А прога в одном регионе пусть показывает только на одной языке. Или Вам нужны данные для сайта ? Ну очень похоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 16:54 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
LSV, Данные не для сайта. Система одна, интерфейс основной один, в нем и должна происходить смена языка. Делать еще две сотни таблиц под каждую не целесообразно, как на меня вариант хранить все в поле BLOB, а на базе виртуальных вычисляемых столбцов строить авто перевод на текущий язык. Тестируем еще пару вариантов, посмотрим на скорострельность. База как никак 3 терабайта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 17:02 |
|
||
|
Ваши рекомендации по структуре мультиязичности данных БД
|
|||
|---|---|---|---|
|
#18+
LSVДа ну ? Задача как раз и стоит в локализации контента (!) Такой задачи не поставлено. Хотя обсуждаемая схема плавно решит её без каких-либо дополнительных работ. При запуске на "нелокализованных" данных будет выдаваться язык по умолчанию (то есть текущее содержимое поля), а редактирование приведёт к записи уже в форматированном виде обоих значений. LSVи обсуждения структуры таблиц, Видите ли в чём дело.... поставленная задача - это не "доработать таблицы, дописать код". Так ставят задачу кодировщикам, и наружу такие постановки не выходят. Поставленная задача в данном случае - прикрутить мультиязычность к работающему Oracle/Delphi/GUI проекту. LSVКак в ОЛАПе разруливать строку, в кот. языки отделены самодельными текстовыми тегами ? Вы вообще с ОЛАП когда-нибудь сталкивались? Слово "разруливать" вызывает глубокий вопрос, что Вы имеете в виду, но на всякий случай подскажу: ОЛАПу строки вообще в 100% случаев пофиг, ему не нужны никакие операции с ними, и участвуют они только как надписи на осях. Также напомню вопрос, который Вы стыдливо заминаете: а где в постановке задачи этот пресловутый ОЛАП? Сами придумали, вместе со всем прочим, что несёте? LSVНа самом деле весьма трудоемкая работа, если делать по уму, а не залипуху. Серьезная переделка должна коснуться буквально всего и ГУИ и БД. Везде должен фигурировать желаемый параметр. Вам бы, батенька, в продавцы пойти, раскручивать лохов на "трудоёмкие работы" вместо того, что им нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2011, 18:33 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37340781&tid=1542094]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
432ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 764ms |

| 0 / 0 |
