Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Мультиязычность


Автор: jsse 22.5.2006, 00:15
  Как правильно должна быть построена БД для мультиязычного содержания?

 Скажем у меня есть данные с названиями товаров и их параметрами.
Параметры и товары находяться в разных таблицах. Товаров может быть сотни тысяч, а параметров на каждый товар - десятки.

Сейчас у меня сделано так:

Код

product(id, string_id)
INDEX id
attribute(id, product_id, string_id)
INDEX id, product_id
languages_cont(id, lang_id, string)
INDEX id, lang_id


Но скорость выполнения запроса оставляет желать лучшего. При выборе 10 случайных товаров на запрос уходит 2-3 секунды, а в базе 20000 товаров и 3 языка.

Перевод названий должен быть в одной таблице для всех языков или в разных для каждого? 

Автор: skyboy 22.5.2006, 00:46
Вариант - отделить названия товаров от таблицы связей. Полностью.
//Список названий языков. Для выбора в интерфейсе.
languages(idlanguage,string)
INDEX idlanguage
_
// Просто список идентификаторов продукта. Если имеются данные о продукте, не привязанные к языку отображения, могут быть заненсены в эту базу. Но по условию, таких данных нет. 
products(idproduct)
INDEX idproduc(autoinc)
_
// Названия продукта в разных языках
product_names(idproduct,idlanguage,name:string)
INDEX idproduct,idlanguage
_
// список аттрибутов. Если имеются характеристики аттрибутов, не привязанные к языку, могут быть занесены.. нет, не в Красную книгу  smile ...сюда, в эту базу
attributes(idattribute)
INDEX idattribute
_
// названия аттрибутов на разных языках
attribute_names(idattribute,idlanguage,name:string)
INDEX idattribute,idlanguage
_
// как я понял, значения аттрибутов - текстовые? тут хранится только связка аттрибута продукта с конкретным значением аттрибута
attribute_values(idproduct,idattribute,idvalue)
INDEX idproduct,idattribute
_
// Перевод значения аттрибута на разные языки...
attribute_values_names(idvalue,idlanguage,name)
INDEX idvalue,idlanguage
_____
Возможно, громоздко вышло. На гениальность не претендую smile
Какая БД, кстати? Ведь если Вы вдруг надумаете переводы пихать в разные таблицы, в соотвествии с языков, в некоторых СУБД Вас будет ожидать сюрприз в виде невозможности выполнения динамического SQL-запроса(например, в MySQL), и при добавлении нового языка придётся переписывать программу...   

Автор: batigoal 22.5.2006, 09:21
У нас локализация сделана на основе одной таблицы лейблов. Упрощенно, поля её таковы:
ID (номер)
Locale (локаль)
Title (название лейбла)
Value (значение)

Т.е. содержимое может быть примерно таким:
ID |  Locale  |            Title          |   Value
===========================
1   | EN_UK  |  WINDOW_TITLE  |  "Title"
2   | EN_US  |  WINDOW_TITLE  |  "Title"
3   | RU_RU  |  WINDOW_TITLE  |  "Заголовок"

Плюс введена еще колонка доменов, для группировки свойств. Введен индекс на пару столбцов (домен - локаль), т.к. выборка, как правило, идет именно по доменам. 

Автор: ALKS 22.5.2006, 12:01
ну во первых мульти-локэил данные нужно сохранять в базе без потери этого языка... и это уже вопрос к конкретному серверу БД.
может быть сервер поддерживает столбцы UNICODE, а может и нет. Нужно вообщем сразу выяснить как ваш сервер сможет  тексты на иврите, русском и английском хранить в одном столбце одной табилцы. в худшем случае придеться сливать их как binary data...

Мы пошли таким же путем как Lamer George. у нас одна таблица для всех локализированных текстов, с тройным ключом: Locale, ObjectType, ObjectID. Причем ObjectID - альфанумерик и хранит фактически primary key из других таблиц без cохранения оригинального типа этого ключа. хорошо это тем что удобно - одна таблица для локализации чего угодно. плохо это тем что не возможно наложить Foreign key. Т.е. фактически эта таблица денормализует базу... 

Автор: jsse 25.5.2006, 18:26
Спасибо! Очень хорошее решение. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)