Как поддерживать подход Мультиязыков в Схеме базы данных?

Я хочу, чтобы моя база данных поддерживала много Языки для всех текстовых значений в его таблицах.

Таким образом, что лучший подход должен сделать это?.

Edit1::

НАПРИМЕР.

У меня есть эта таблица "Person":

ID int
FirstName  nvarchar(20)
LastName   nvarchar(20)
Notes      nvarchar(max)
BirthDate  date
...........

Таким образом, если я хочу, чтобы моя программа поддерживала новый язык, "позволяют, говорят французы".

я должен добавить новый столбец каждый раз, когда я добавляю новый язык? Таким образом, моя таблица "Person" будет похожа на это

ID int
FirstName_en  nvarchar(20)
FirstName_fr  nvarchar(20)
LastName_en   nvarchar(20)
LastName_fr   nvarchar(20)
Notes_en      nvarchar(max)
Notes_fr      nvarchar(max)
BirthDate     date
...........

Или я должен добавить 2 новых таблицы один для языков и другого для значений "Person_Languages"?

Таким образом, это будет похоже: таблица "Languages":

ID           int
Lang-symbol  nvarchar(4)

Таблица "Человека":

ID         int
BirthDate  Date

и наконец таблица "Person_Translation":

LangID        int
PersonID      int
Translation   nvarchar(max)

Или лучше существует что-то??

.

9
задан Wahid Bitar 30 December 2009 в 13:57
поделиться

1 ответ

Мне пришлось иметь дело с этим в базе данных допросов. Необходимо было перевести несколько вопросительных знаков на несколько языков (английский, японский, китайский).

Сначала мы определили все текстовые столбцы, которые будут распечатаны на вопросительных знаках. Для всех этих столбцов нам нужно было иметь возможность хранить перевод. Для каждой таблицы, содержащей текстовые колонки, требующие перевода, мы создали таблицу _переводов, имеющую посторонний ключ, указывающий на первичный ключ исходной таблицы, посторонний ключ к нашей языковой таблице, а затем колонку Unicode для каждого текстового поля, требующего перевода. В этих текстовых столбцах мы хранили переводы для каждого нужного нам языка.

Так что типичный запрос будет выглядеть следующим образом:

select     p.id
,          pt.product_name
,          pt.product_description
from       product                  p
inner join product_translations pt
on         p.id = pt.product_id
and        'fr' = pt.language_code

Так что для получения переводов всегда достаточно одного дополнительного соединения (для каждой таблицы).

Я должен отметить, что нам пришлось иметь дело только с ограниченным количеством таблиц, так что не было большой проблемой поддерживать несколько дополнительных таблиц %_translations.

Мы рассмотрели возможность добавления столбцов для нового языка, но решили не делать этого по нескольким причинам. Прежде всего, количество поддерживаемых языков было неизвестно, но могло быть существенным (10, 20 или, может быть, больше). В сочетании с тем фактом, что в большинстве таблиц было как минимум 3 отдельных читаемых человеком столбца, нам пришлось бы добавлять много, много текстовых столбцов, в результате чего получились бы очень широкие строки. Поэтому мы решили не делать этого.

Другой подход, который мы рассмотрели, состоит в том, чтобы сделать одну большую таблицу "label", имеющую колонки:

( table_name)( имя_таблицы id_of_table column_name язык translate_text)

фактически имея одну таблицу для хранения всех переводов в любой точке БД. Мы решили не делать этого и потому, что это усложнит написание запросов (так как каждый "нормальный" столбец приведет к одной строке в таблице переводов, в результате чего и без того большая таблица переводов будет многократно присоединяться к нормальной таблице (один раз для каждого переведенного столбца). Для примера таблицы перевода вы получите такие запросы:

select     product.id 
,          product_name.translated_text product_name
,          product_description.translated_text product_description
from       product p
inner join translations product_name
on         p.id = product_name.id
and        'product'      = product_name.table_name
and        'product_name' = product_name.column_name
and        'fr'           = product_name.language
inner join translations product_description
on         p.id = product_name.id
and        'product'      = product_description.table_name
and        'product_description' = product_description.column_name
and        'fr'           = product_description.language

как вы видите, в сущности, это что-то вроде схемы "объект-атрибут-значение", что делает запрос обременительным.

Другая проблема этого последнего подхода заключается в том, что это усложнит, а то и вовсе сделает невозможным, введение ограничений на переведенный текст (в нашем случае, в основном, ограничений на унифицированность). С помощью разделительной таблицы для переводов вы можете легко и чисто преодолеть эти проблемы

.
9
ответ дан 4 December 2019 в 20:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: