powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Дизайн ДБ с учетом различных языков
23 сообщений из 23, страница 1 из 1
Дизайн ДБ с учетом различных языков
    #34992939
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)

Спасибо
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #34992989
step_ks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 ссылка на справочник языков.
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #34993013
step_ks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 ссылка на справочник языков.
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #34993014
step_ks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения за дубль.
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #34994202
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Клаcсика:

Category( CategoryId , <языконезависимые данные>)
Lang (LanguageId , LangCode)
CategoryLang( CategoryId, LanguageId , CategoryName)
LangLang (LanguageObjId, LanguageSubId , LangName -- наменование целевого языка на языке субъекта)
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #34994766
KGP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRКлаcсика:
Lang (LanguageId , LangCode)
LangLang (LanguageObjId, LanguageSubId , LangName -- наменование целевого языка на языке субъекта)

как они связаны?
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #34995320
bigor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
step_ksА нужно будет добавить еще один язык - будете структуру БД менять?
Имхо, лучше сделать Category(CategoryId, CategoryName, LanguageId), где LanguageId ссылка на справочник языков.

Дело в том, что мне надо чтобы одна и та жу категория (на EN, ES, PT) имела одно и то же Id
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #34995595
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bigor step_ksА нужно будет добавить еще один язык - будете структуру БД менять?
Имхо, лучше сделать Category(CategoryId, CategoryName, LanguageId), где LanguageId ссылка на справочник языков.

Дело в том, что мне надо чтобы одна и та жу категория (на EN, ES, PT) имела одно и то же Id странное желание, но пусть будет... сделайте составной PK: CategoryID,LanguageID
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #35006171
bigor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorychстранное желание, но пусть будет... сделайте составной PK: CategoryID,LanguageID

"А ведь это мысль Егорыч... Ох, какая мысль!".

Спасибо, ребята. Помогли. Всем зачет (шутю, конечно) ;)
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #35006759
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KGP ModelRКлаcсика:
Lang (LanguageId , LangCode)
LangLang (LanguageObjId, LanguageSubId , LangName -- наменование целевого языка на языке субъекта)

как они связаны?
FK "целевой язык" LangLang.LanguageObjId ref Lang.LanguageId
FK "язык субъекта" LangLang.LanguageSubId ref Lang.LanguageId
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #35006843
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bigorЧто лучше сделать с точки зрения дизайна ДБ:
"Дизайн БД" - это абстрактное и малоосмысленное понятие. Вопрос в конкретных задачах, которые будут стоять. Например, если я поставлю задачу таким образом: "У любой категории обязано быть английское название. На других языках должно выводиться национальное название, если задано, и английское, если национального нет" - варианты с развязками по LangID становятся неудобными, а "широкие" таблицы, наоборот, получают плюс. И так далее.
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #35011728
Фотография Ursego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В этом случае создавая набор записей на другом языке, копируй в него английские название. Те, которые не будут заменены, так и останутся существовать на английском, поэтому запрос типа

Код: plaintext
1.
2.
select что-то
from таблица
where язык = испанский

вернёт испанское слово, а если не переведено, то английское. Но, право, не стОит ради этого превращать реляционную таблицу в страничку Excel!
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #35011744
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UrsegoВ этом случае создавая набор записей на другом языке, копируй в него английские название.
Совет особенно удачен для операции "удалить название на национальном языке" :)

UrsegoНо, право, не стОит ради этого превращать реляционную таблицу
Какую-какую? Я вот почему-то всю жизнь считал, что реляционная теория посвящена в первую очередь приемам ликвидации таких вот "бери и копируй"...
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #35011746
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer UrsegoВ этом случае создавая набор записей на другом языке, копируй в него английские название.
Совет особенно удачен для операции "удалить название на национальном языке" :)
Нет, вру. Особенно он удачен для операции "изменить название на английском языке".
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #35011906
Фотография Ursego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЯ вот почему-то всю жизнь считал, что реляционная теория посвящена в первую очередь приемам ликвидации таких вот "бери и копируй"...Реляционная теория не против создания дополнительных записей когда их конечное число неизвестно и может произвольно меняться (в данном примере - наборов записей на других языках), но против добавления для этой цели столбцов (именно такую таблицу я грязно обозвал страницей Excel).

Приведу пример (очень надуманный, но который подчеркнёт мысль). Решил ты создать таблицу (реляционную донельзя!) для хранения данных о своих родственниках. Хранить надо имя, фамилию и дату рождения. Ты ведь не будешь создавать тройку столбцов для каждого родича (особенно тёща не дождётся!), например:

id, wife_fname, wife_lname, wife_birth_date, son_fname, son_lname, son_birth_date и т.д. (т.е. десятки столбцов),

а создашь вот такую компактную таблицу:

id, relationship, fname, lname, birth_date.

Верно? Вот так и с языками. Я это не придумал на пустом месте - мне приходилось писать систему для нескольких европейских городов (селлюлярный паркинг), где из базы данных считывались (и динамически устанавливались на окнах) даже надписи на/возле элементов управления, не говоря уже о самих данных. В Канаде участвовал в проекте (для ГАИ города Виннипега), где часть окон могла загружаться на английском или французском, причём мы, девелоперы, имели набор записей на английском, а перевод на французский производился специальной правительственной организацией. Так что это не мой мотороллер.
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #35011911
Фотография Ursego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerОсобенно он удачен для операции "изменить название на английском языке".ОК, убедил. Почему бы просто не хранить NULL там, где перевода нет? А при выборке если наткнулся на NULL, то взять из англиского "набора". Если данные выбираются простым SELECT-ом, то в случае натыкания на NULL запустить inline sub-query, которое и вернёт вместо отсутствующего перевода английскую версию. Если данные выбираются хранимой процедурой - и того легче: извлечь в переменную из "другого языка", если ничего не найдено - извлечь в переменную из английского языка.

Господа, о какой фигне мы тут говорим в то время, когда наши космические корабли бороздят...
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #35011983
bigor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал создать табличку (CategoryId, CategoryName, LanguageId). Записал в поле CategoryName 2 слова: одно на английском другое на русском. Сделал простой select по имени. Так вот - английское слово находит, а русское нет.

"Нам такой футбол не нужен".

Что надо "подправить в консерватории"? Другой select? Кодировку? Может для каждого языка лучше создать отдельную дазу банных?
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #35013837
-----------------
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bigorМожет для каждого языка лучше создать отдельную дазу банных?...на двух отдельных серверах в друх отдельных странах...
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #35015135
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerесли я поставлю задачу таким образом: "У любой категории обязано быть английское название. На других языках должно выводиться национальное название, если задано, и английское, если национального нет" - варианты с развязками по LangID становятся неудобными, а "широкие" таблицы, наоборот, получают плюс. И так далее.
Требования к такой "словарной системе" вполне могут меняться после того, как она уже сделана и выпущена. Я, например, не считаю, что требование замены отсутствующего названия на соответствующее ему в языке по умолчанию настолько серьезное, что ради этого стоит пложить лишние поля для каждого нового языка. Такое требование вполне может возникнуть как дополнительное к уже готовой системе и не должно приводить к существенному изменению схемы. Можно данные тащить через вьюхи, по крайней мере меня это менее напряжет, чем добавлять новые поля для новых языков.

bigorТак вот - английское слово находит, а русское нет
Если еще актуально, приведите скрипт, которым можно создать таблицы и заполнить их, и скрипт ошибочного селекта.
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #35015778
AlexTheRaven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bigor<...>
Что лучше сделать с точки зрения дизайна ДБ:
<...>
Связь "[0,1]-[1,1]" нужна только из соображений оптимизации или невозможности физической реализации. В случае BLOBов она может быть ещё хоть как-то оправдана, но тут зачем огород городить с дополнительными таблицами, нарываться на лишние join'ы? Добавляйте 2 колонки справа. Понадобится - добавите ещё. Просто не надо использовать SQL-операторы без явного перечисления столбцов, и компоненты (в т.ч. ORM), к-рые такие операторы используют.
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #35015817
Фотография Ursego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexTheRavenзачем огород городить с дополнительными таблицами, нарываться на лишние join'ы?А лишние таблицы и не нужны - нужна одна, в которой будут храниться наборы записей (сеты) для каждого языка. Причём таблицу даже не надо делить на партишнз - число записей в ней будет смехотворно с точки зрения современных баз данных. Просто выбираешь простым select-ом, добавляя
Код: plaintext
WHERE language = такой-то
, вот и усе дела!

AlexTheRavenДобавляйте 2 колонки справа. Понадобится - добавите ещё.Позвольте не согласиться. Это, так сказать, закон Бойля-Мариотта: структура базы данных должна обеспечивать возможности расширения и изменения системы без необходимости изменять эти структуру. Конечно, это не всегда возможно, но в данном случае - легко. Понадобился новый язык - добавляй набор данных для этого языка, и приложение продолжает прекрасно работать без необходимости изменения других объектов! А если добавлять новые столбцы в таблицу, что само по себе нетрудно, то придётся ещё и изменять соответственно объекты (хранимые процедуры, объекты клиентской части), которые эту таблицу считывают и обрабатывают. Причём не только изменять, но и тестировать каждый раз. Как сказала Галина Польских в фильме "Паспорт", "нам это надо?".

AlexTheRavenПросто не надо использовать SQL-операторы без явного перечисления столбцов, и компоненты (в т.ч. ORM), к-рые такие операторы используют.Этот совет верен всегда и везде.
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #35016001
bigor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Васкецов
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'Русский язык'
...
Рейтинг: 0 / 0
Дизайн ДБ с учетом различных языков
    #35016178
AlexTheRaven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ursego AlexTheRavenзачем огород городить с дополнительными таблицами, нарываться на лишние join'ы?А лишние таблицы и не нужны - нужна одна, в которой будут храниться наборы записей (сеты) для каждого языка. Причём таблицу даже не надо делить на партишнз - число записей в ней будет смехотворно с точки зрения современных баз данных. Просто выбираешь простым select-ом, добавляя
Код: plaintext
WHERE language = такой-то
, вот и усе дела!
Я спорил с двумя отношениями, описанными вверху, а не с одним "узким".
Впрочем, говоря "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 языках :) ), "широкая" - немного проще для использования в приложении и намного - для манипулирования вручную. А структура БД - не победитовая, менять её не сложнее и не опаснее, чем любой другой код.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Дизайн ДБ с учетом различных языков
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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