2012-04-28 4 views
0

Я добавляю поддержку нескольких языков в свой db. Он имеет около 10 различных таблиц с различными структурами. Я наметил структуру, ниже которой я считаю, это хороший подход:Эффективная структура базы данных MYSQL для интернационализации

Таблица Языки:

lang_id (int) 
lang_name (varchar 128) 

Таблица Пример 1:

sample_1_id (int) 
name (int -- tran_id) 
description (int -- tran_id) 

Таблица Пример 2:

sample_2_id (int) 
person (int -- tran_id) 
page (int -- tran_id) 

Таблица Переводы:

tran_id (int) 
lang_id (int) 
content (text) 

Однако, чтобы сделать эту работу по всем направлениям не будет столбец контента в таблице переводов должны быть типа «текст»? Если бы это было не так, что пространство для отходов, особенно когда большинство данных, хранящихся в нем, просто будет несколько символов? Есть ли способ лучше?

+0

Непонятно из примера, как таблицы 'sample_% 'отображают либо таблицы' languages', либо 'translations' –

+0

Thx. Просто сделал редактирование, чтобы показать, что все столбцы контента будут иметь int, соответствующий tran_id – jsuissa

+1

. Я почти понимаю сейчас! Не получается, почему есть две таблицы образцов. Не могли бы вы управлять именами/фразами с таблицей '(name, lang_id, content)' (или '(name_id, lang_id)' и другой таблицей имен '(name_id, name)??) –

ответ

3

Рассмотрите две таблицы переводов. Один, как это:

Translations_Short:

tran_id (int) 
lang_id (int) 
content (VARCHAR(255)) 

Обратите внимание, что предел для VARCHAR в MySQL 5.0.3+ на самом деле 65535 байт, хотя это также предельное число строк. Таким образом, вы можете использовать:

tran_id (int) 
lang_id (int) 
content (VARCHAR(65522)) 

И другой, как это:

Translations_Long:

tran_id (int) 
lang_id (int) 
content (text) 

TEXT только 65535, так и с MySQL 5.0.3+, это уже охвачены. Вы можете также использовать MEDIUMTEXT здесь.

Затем, вы можете решить, в колонке, как это:

sample_1_id (int) 
name (int -- tran_long_id) 
description (int -- tran_short_id) 

Ваше приложение будет знать, какой из ссылки, не так ли?

В любом случае, ТЕКСТ на самом деле не использует намного больше места, чем VARCHAR. Может быть, один или два байта. Это производительность, это проблема, а не пространство. Поскольку вы не будете индексировать столбец TEXT, это тоже вряд ли будет проблемой, если только вы не планируете использовать индексы покрытия (что было бы невозможно с помощью TEXT). Индексы для VARCHAR в любом случае ограничены 767 байтами, поэтому вы не можете использовать индексы покрытия с столбцами VARCHAR более 767 байт.

Но это позволит вам разделить их, если вы действительно считаете это необходимым.

+0

Это отличный подход, но похоже, что вы говорите, что мой переведенный контент относительно невелик по размеру, и не обязательно его разделять. VARCHAR (65522) достаточно велик, чтобы покрыть все. – jsuissa

+0

Хорошо, я добавил еще одно хорошее решение для управления FK между таблицами langs. – llioor

0

Как насчет этого ... Возьмем, к примеру, таблицу «страниц».

Главная "страницы" таблица:

ID - первичный

ссылка

adate

EDATE

статус

и т.д ...

Перевести "pages_langs" стол:

page_id - первичный один

lang_id - "языки" таблица для примера 1 ** здесь все, что вы хотите управлять для перевода **

название - название страницы, например, с lang_id = 1

текст

термин - (термин для URL украсить и такие вещи, как это и должно быть в LANGS таблица)

"языки" стол:

ID - первичный

название

префикс

ВЫБОР будет таким:

SELECT p.id, p.link, pl.title, pl.text 
FROM pages 
INNER JOIN pages_langs pl ON p.id = pl.page_id AND pl.lang_id = <<current lang id>> 

Есть вопросы?

Смежные вопросы