|
|
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
Есть БД, которая работает с веб-приложением (точнее с 3-мя приложениями на 3-х различных языках: EN, ES, PT). В БД есть таблица Category(CategoryId, CategoryName), в котророй содержатся English категории. Надо добавить Spanish и Portuguese категории, чтобы они показывались на ES, PT сайтах на нужном языке. Все категории одни и те же (1-1 Relationship) Что лучше сделать с точки зрения дизайна ДБ: 1 - добавить 2 колонки в существуюшую таблицу Category(CategoryId, CategoryName, CategoryName_ES, CategoryName_PT ) или 2 - создать еще 2 таблицы Category_ES(CategoryId, CategoryName_ES), Category_PT(CategoryId, CategoryName_PT) Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 01:25 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
bigorЕсть БД, которая работает с веб-приложением (точнее с 3-мя приложениями на 3-х различных языках: EN, ES, PT). В БД есть таблица Category(CategoryId, CategoryName), в котророй содержатся English категории. Надо добавить Spanish и Portuguese категории, чтобы они показывались на ES, PT сайтах на нужном языке. Все категории одни и те же (1-1 Relationship) Что лучше сделать с точки зрения дизайна ДБ: 1 - добавить 2 колонки в существуюшую таблицу Category(CategoryId, CategoryName, CategoryName_ES, CategoryName_PT ) или 2 - создать еще 2 таблицы Category_ES(CategoryId, CategoryName_ES), Category_PT(CategoryId, CategoryName_PT) Спасибо А нужно будет добавить еще один язык - будете структуру БД менять? Имхо, лучше сделать Category(CategoryId, CategoryName, LanguageId), где LanguageId ссылка на справочник языков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 05:27 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
bigorЕсть БД, которая работает с веб-приложением (точнее с 3-мя приложениями на 3-х различных языках: EN, ES, PT). В БД есть таблица Category(CategoryId, CategoryName), в котророй содержатся English категории. Надо добавить Spanish и Portuguese категории, чтобы они показывались на ES, PT сайтах на нужном языке. Все категории одни и те же (1-1 Relationship) Что лучше сделать с точки зрения дизайна ДБ: 1 - добавить 2 колонки в существуюшую таблицу Category(CategoryId, CategoryName, CategoryName_ES, CategoryName_PT ) или 2 - создать еще 2 таблицы Category_ES(CategoryId, CategoryName_ES), Category_PT(CategoryId, CategoryName_PT) Спасибо А нужно будет добавить еще один язык - будете структуру БД менять? Имхо, лучше сделать Category(CategoryId, CategoryName, LanguageId), где LanguageId ссылка на справочник языков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 06:51 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
Прошу прощения за дубль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 06:53 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
Клаcсика: Category( CategoryId , <языконезависимые данные>) Lang (LanguageId , LangCode) CategoryLang( CategoryId, LanguageId , CategoryName) LangLang (LanguageObjId, LanguageSubId , LangName -- наменование целевого языка на языке субъекта) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 14:31 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
ModelRКлаcсика: Lang (LanguageId , LangCode) LangLang (LanguageObjId, LanguageSubId , LangName -- наменование целевого языка на языке субъекта) как они связаны? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 16:55 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
step_ksА нужно будет добавить еще один язык - будете структуру БД менять? Имхо, лучше сделать Category(CategoryId, CategoryName, LanguageId), где LanguageId ссылка на справочник языков. Дело в том, что мне надо чтобы одна и та жу категория (на EN, ES, PT) имела одно и то же Id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 19:30 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
bigor step_ksА нужно будет добавить еще один язык - будете структуру БД менять? Имхо, лучше сделать Category(CategoryId, CategoryName, LanguageId), где LanguageId ссылка на справочник языков. Дело в том, что мне надо чтобы одна и та жу категория (на EN, ES, PT) имела одно и то же Id странное желание, но пусть будет... сделайте составной PK: CategoryID,LanguageID ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2007, 02:04 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
egorychстранное желание, но пусть будет... сделайте составной PK: CategoryID,LanguageID "А ведь это мысль Егорыч... Ох, какая мысль!". Спасибо, ребята. Помогли. Всем зачет (шутю, конечно) ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2007, 06:26 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
KGP ModelRКлаcсика: Lang (LanguageId , LangCode) LangLang (LanguageObjId, LanguageSubId , LangName -- наменование целевого языка на языке субъекта) как они связаны? FK "целевой язык" LangLang.LanguageObjId ref Lang.LanguageId FK "язык субъекта" LangLang.LanguageSubId ref Lang.LanguageId ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2007, 11:36 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
bigorЧто лучше сделать с точки зрения дизайна ДБ: "Дизайн БД" - это абстрактное и малоосмысленное понятие. Вопрос в конкретных задачах, которые будут стоять. Например, если я поставлю задачу таким образом: "У любой категории обязано быть английское название. На других языках должно выводиться национальное название, если задано, и английское, если национального нет" - варианты с развязками по LangID становятся неудобными, а "широкие" таблицы, наоборот, получают плюс. И так далее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2007, 11:49 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
В этом случае создавая набор записей на другом языке, копируй в него английские название. Те, которые не будут заменены, так и останутся существовать на английском, поэтому запрос типа Код: plaintext 1. 2. вернёт испанское слово, а если не переведено, то английское. Но, право, не стОит ради этого превращать реляционную таблицу в страничку Excel! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2007, 21:01 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
UrsegoВ этом случае создавая набор записей на другом языке, копируй в него английские название. Совет особенно удачен для операции "удалить название на национальном языке" :) UrsegoНо, право, не стОит ради этого превращать реляционную таблицу Какую-какую? Я вот почему-то всю жизнь считал, что реляционная теория посвящена в первую очередь приемам ликвидации таких вот "бери и копируй"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2007, 21:21 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
softwarer UrsegoВ этом случае создавая набор записей на другом языке, копируй в него английские название. Совет особенно удачен для операции "удалить название на национальном языке" :) Нет, вру. Особенно он удачен для операции "изменить название на английском языке". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2007, 21:22 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
softwarerЯ вот почему-то всю жизнь считал, что реляционная теория посвящена в первую очередь приемам ликвидации таких вот "бери и копируй"...Реляционная теория не против создания дополнительных записей когда их конечное число неизвестно и может произвольно меняться (в данном примере - наборов записей на других языках), но против добавления для этой цели столбцов (именно такую таблицу я грязно обозвал страницей Excel). Приведу пример (очень надуманный, но который подчеркнёт мысль). Решил ты создать таблицу (реляционную донельзя!) для хранения данных о своих родственниках. Хранить надо имя, фамилию и дату рождения. Ты ведь не будешь создавать тройку столбцов для каждого родича (особенно тёща не дождётся!), например: id, wife_fname, wife_lname, wife_birth_date, son_fname, son_lname, son_birth_date и т.д. (т.е. десятки столбцов), а создашь вот такую компактную таблицу: id, relationship, fname, lname, birth_date. Верно? Вот так и с языками. Я это не придумал на пустом месте - мне приходилось писать систему для нескольких европейских городов (селлюлярный паркинг), где из базы данных считывались (и динамически устанавливались на окнах) даже надписи на/возле элементов управления, не говоря уже о самих данных. В Канаде участвовал в проекте (для ГАИ города Виннипега), где часть окон могла загружаться на английском или французском, причём мы, девелоперы, имели набор записей на английском, а перевод на французский производился специальной правительственной организацией. Так что это не мой мотороллер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2007, 00:19 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
softwarerОсобенно он удачен для операции "изменить название на английском языке".ОК, убедил. Почему бы просто не хранить NULL там, где перевода нет? А при выборке если наткнулся на NULL, то взять из англиского "набора". Если данные выбираются простым SELECT-ом, то в случае натыкания на NULL запустить inline sub-query, которое и вернёт вместо отсутствующего перевода английскую версию. Если данные выбираются хранимой процедурой - и того легче: извлечь в переменную из "другого языка", если ничего не найдено - извлечь в переменную из английского языка. Господа, о какой фигне мы тут говорим в то время, когда наши космические корабли бороздят... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2007, 00:32 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
Попробовал создать табличку (CategoryId, CategoryName, LanguageId). Записал в поле CategoryName 2 слова: одно на английском другое на русском. Сделал простой select по имени. Так вот - английское слово находит, а русское нет. "Нам такой футбол не нужен". Что надо "подправить в консерватории"? Другой select? Кодировку? Может для каждого языка лучше создать отдельную дазу банных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2007, 03:10 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
bigorМожет для каждого языка лучше создать отдельную дазу банных?...на двух отдельных серверах в друх отдельных странах... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 10:44 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
softwarerесли я поставлю задачу таким образом: "У любой категории обязано быть английское название. На других языках должно выводиться национальное название, если задано, и английское, если национального нет" - варианты с развязками по LangID становятся неудобными, а "широкие" таблицы, наоборот, получают плюс. И так далее. Требования к такой "словарной системе" вполне могут меняться после того, как она уже сделана и выпущена. Я, например, не считаю, что требование замены отсутствующего названия на соответствующее ему в языке по умолчанию настолько серьезное, что ради этого стоит пложить лишние поля для каждого нового языка. Такое требование вполне может возникнуть как дополнительное к уже готовой системе и не должно приводить к существенному изменению схемы. Можно данные тащить через вьюхи, по крайней мере меня это менее напряжет, чем добавлять новые поля для новых языков. bigorТак вот - английское слово находит, а русское нет Если еще актуально, приведите скрипт, которым можно создать таблицы и заполнить их, и скрипт ошибочного селекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 16:06 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
bigor<...> Что лучше сделать с точки зрения дизайна ДБ: <...> Связь "[0,1]-[1,1]" нужна только из соображений оптимизации или невозможности физической реализации. В случае BLOBов она может быть ещё хоть как-то оправдана, но тут зачем огород городить с дополнительными таблицами, нарываться на лишние join'ы? Добавляйте 2 колонки справа. Понадобится - добавите ещё. Просто не надо использовать SQL-операторы без явного перечисления столбцов, и компоненты (в т.ч. ORM), к-рые такие операторы используют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 19:01 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
AlexTheRavenзачем огород городить с дополнительными таблицами, нарываться на лишние join'ы?А лишние таблицы и не нужны - нужна одна, в которой будут храниться наборы записей (сеты) для каждого языка. Причём таблицу даже не надо делить на партишнз - число записей в ней будет смехотворно с точки зрения современных баз данных. Просто выбираешь простым select-ом, добавляя Код: plaintext AlexTheRavenДобавляйте 2 колонки справа. Понадобится - добавите ещё.Позвольте не согласиться. Это, так сказать, закон Бойля-Мариотта: структура базы данных должна обеспечивать возможности расширения и изменения системы без необходимости изменять эти структуру. Конечно, это не всегда возможно, но в данном случае - легко. Понадобился новый язык - добавляй набор данных для этого языка, и приложение продолжает прекрасно работать без необходимости изменения других объектов! А если добавлять новые столбцы в таблицу, что само по себе нетрудно, то придётся ещё и изменять соответственно объекты (хранимые процедуры, объекты клиентской части), которые эту таблицу считывают и обрабатывают. Причём не только изменять, но и тестировать каждый раз. Как сказала Галина Польских в фильме "Паспорт", "нам это надо?". AlexTheRavenПросто не надо использовать SQL-операторы без явного перечисления столбцов, и компоненты (в т.ч. ORM), к-рые такие операторы используют.Этот совет верен всегда и везде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 19:21 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов bigorТак вот - английское слово находит, а русское нет Если еще актуально, приведите скрипт, которым можно создать таблицы и заполнить их, и скрипт ошибочного селекта. Таблицу создал мануально: CREATE TABLE [dbo].[tbMultiLanguageCategories]( [CategoryId] [int] NULL, [CategoryName] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [LanguageId] [char](2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) ON [PRIMARY] После того, как добавил N в select, русское слово нашел select * from tbMultiLanguageCategories where CategoryName = N'Русский язык' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 20:37 |
|
||
|
Дизайн ДБ с учетом различных языков
|
|||
|---|---|---|---|
|
#18+
Ursego AlexTheRavenзачем огород городить с дополнительными таблицами, нарываться на лишние join'ы?А лишние таблицы и не нужны - нужна одна, в которой будут храниться наборы записей (сеты) для каждого языка. Причём таблицу даже не надо делить на партишнз - число записей в ней будет смехотворно с точки зрения современных баз данных. Просто выбираешь простым select-ом, добавляя Код: plaintext Я спорил с двумя отношениями, описанными вверху, а не с одним "узким". Впрочем, говоря "WHERE language = такой-то", вы лукавите. SELECT category_name FROM categories WHERE category_id='10' AND language='es' всё же несколько сложнее для человека, чем SELECT category_name_es FROM categories WHERE category_name='books'. К тому же, чтобы задать на 3 языках, названия, например, 10 категорий, в "узкой" таблице понадобится 30 операций и ведение цифровых Id вручную, в "широкой" - всего 10 операций. Хотя, конечно, если ввод категорий - повседневная задача, и предполагается делать для этого специальный UI - это неважно. Ursego <...> структура базы данных должна обеспечивать возможности расширения и изменения системы без необходимости изменять эти структуру. IMHO это верно, если точно известно, что изменения будут происходить регулярно, т.к. за универсальность надо дорого платить. Ursego Конечно, это не всегда возможно, но в данном случае - легко. Понадобился новый язык - добавляй набор данных для этого языка, и приложение продолжает прекрасно работать без необходимости изменения других объектов! В любом случае, где-то в приложении в случае "узкой" таблицы надо задать что-то наподобие strLanguagePredicate="language='ru'". Ну а в случае "широкой" - strLanguageColumn="category_name_ru". И там, и здесь - динамический SQL. То на то. Ursego А если добавлять новые столбцы в таблицу, что само по себе нетрудно, то придётся ещё и изменять соответственно объекты (хранимые процедуры, объекты клиентской части), которые эту таблицу считывают и обрабатывают. AlexTheRavenПросто не надо использовать SQL-операторы без явного перечисления столбцов, и компоненты (в т.ч. ORM), к-рые такие операторы используют.Этот совет верен всегда и везде. Если пользоваться советом, который вы внизу цитаты называете верным, то описанное сверху цитаты неправильно. UrsegoПричём не только изменять, но и тестировать каждый раз. Добавление нового языкового набора - в любом случае повод потестировать, причём вручную. Трудности перевода, опечатки (в т.ч. трудноуловимые, в Id), кодировки... IMHO работоспособны оба подхода. "Узкая" таблица универсальнее (особенно если предполагается делать систему более чем на 60 языках :) ), "широкая" - немного проще для использования в приложении и намного - для манипулирования вручную. А структура БД - не победитовая, менять её не сложнее и не опаснее, чем любой другой код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 22:32 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34995320&tid=1544132]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
170ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 467ms |

| 0 / 0 |
