2010-05-31 6 views
1

Возможно, мне придется хранить некоторые данные i18n-ed в моей базе данных, используя XML, если я не сопротивляюсь. Это не мой выбор, но в спецификации я должен следовать. Мы бы, к примеру, что-то вроде следующего в столбце «Страна»:Хранение данных i18n в базе данных с использованием XML

<lang='fr'>Etats-Unis</lang> 
<lang='en'>United States</lang> 

Это будет применяться ко многим столбцов в базе данных.

Я не думаю, что это хорошая идея. Я склонен думать, что ячейка в базе данных должна представлять собой единый фрагмент данных (лучше для поиска) и что база данных должна иметь два размера максимум, а не 3 или более (один запрос больше потребуется для каждого измерения/a размер здесь будет равен числу атрибутов XML).

Моя идея состояла в том, чтобы иметь отдельную таблицу для всех переводов с такими столбцами, как: ID/Language/Translation. Тем не менее, я должен признать, что я на самом деле не уверен, что это лучший способ для хранения данных на различных языках в БД ...

Спасибо за ваши советы :)

ответ

1

согласен с вашим видением мышления.

В предыдущем проекте мы сделали то же самое (сохраненные значения I18N в БД), в дополнение к традиционным I18N (файлы ресурсов в решении).

Причина этого в том, что для специальных динамических данных (а не статических строк) требуется перевод. У нас были спортивные состязания - такие как «Футбол», которые нужно было перевести на их специфическое для языка описание.

Для этого у нас была простая таблица поиска со столбцами (LCID - int, SportID - int, Description - nvarchar(256)).

Хранимые процедуры/функции приняли языковой стандарт как целое (например, испанский - 3082), тогда SQL вернет соответствующее чувствительное к культуре описание на основе языкового стандарта. Таким образом, код веб-сервера не знал об этом за кулисами.

Так что вы можете иметь следующие несколько строк:

Lcid  SportID  Description 
3081  1   Soccer 
3082  1   Futbol 

Тогда вы просто присоединиться к этой таблице в вашем SQL, чтобы облегчить I18N.

Небольшой недостаток этого метода заключается в том, что для вашего SQL SP потребуется идентификатор LCID в качестве параметра из кода веб-сервера.

Спорт был обновлен/импортирован с помощью импорта большого объема листа, поэтому нам понадобился I18N в БД.

Это единственный способ, с помощью которого я могу представить, как работает I18N на базе БД.

+0

Что вы думаете о XML-способе его выполнения? – TigrouMeow

+0

Одним словом - сумасшедший. =) Чтобы вытащить нужные данные, вам понадобится вспомогательный UDF, который сканирует это поле (используя некоторую сложную подстроку), а затем возвращает значение. Это само по себе дорого. Тогда подумайте, есть ли у вас несколько таблиц с этим XML-форматом. Экстраполируйте удар производительности, я не вижу, чтобы это было возможно. Почему «требование» хранится как XML? Это формат данных, поступающий из другой системы, которую вы должны хранить в БД? Если это так, почему бы не сопоставить XML с полями, которые вы хотите в БД, в вашем DAL вашего приложения или отдельном модуле. – RPM1984

+0

Если вы говорите о MS SQL 2005 (или новее), то XML будет не так уж плох, поскольку есть встроенные функции для запроса полей XML. Причина, по которой я столкнулся, состояла в том, что я размышляю над тем же. Я предпочитаю использовать XML-поля, имея таблицы для переводов. Для меня это кажется более логичным. – Brendan

0

Хотя XML, возможно, не самый лучший тип для его хранения - хотя, в зависимости от поддержки СУБД, это может быть не так плохо для производительности, как она сначала выглядит - концепция переводов как типа данных, а не нормализация, проблема имеет некоторые достоинства.

My original thoughts on the topic are here, и я все еще поддерживаю их после того, как мои коллеги решили использовать их в реальном мире, хотя я все же могу попытаться написать более эффективную реализацию.

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

Понятие атомарного сложный, философский. Я говорю в своем блоге о том, является ли одна строка «атомарной» - может быть деконструирована в отдельные символы, и вы даже можете знать, что такое первый символ, но с точки зрения области, которую вы моделируете , который обычно рассматривается как репрезентативная деталь, а вся строка - это атом. Менее экстремально, PostgreSQL включает в себя тип «точка», который в основном представляет собой массив из двух чисел, но позволяет непосредственно выражать операции, такие как «содержит» и «выше».

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