Должен быть лучший способ сделать поля локализованной базы данных - PullRequest
14 голосов
/ 05 августа 2010

До сих пор было несколько вопросов по этому поводу, и все они пришли к одному и тому же ответу: одна таблица для данных, не зависящих от языка, 1- * к таблице с переводами и индексированным полем идентификатора языка..

У этого есть несколько проблем:

  1. В два раза больше CRUD.
  2. Потребность в Ajax CRUD, если вам нужен прилично дружественный веб-интерфейс.
  3. Более чем вдвое больше проверки - вам нужно убедиться, что отношение равно 1- *, а не 0 - *.
  4. Различия в сопоставлении между языками не учитываются.
  5. Запросы требуют объединений.
  6. Если вам нужны слизни на нескольких языках, о боже.

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

Я думаю, что в конечном итоге нам нужно:

  • Тип поля, в котором будут храниться несколько версий строк
  • Несколько индексов для каждого такого поля, один длякаждый язык или variation, с возможностью указать правильный режим сортировки
  • Стандартный объект ORM для этой сумасшедшей вещи
  • Элементы пользовательского интерфейса

Overkill?Конечно, может быть, но вся проблема - настоящий кошмар.И это не совсем редкий сценарий.

Мы должны попытаться убедить поставщиков серверов поработать над этим.

Редактировать: Кстати, я впервые используювики сообщества;надеюсь, я делаю это правильно.

Редактировать 2: Что-то в моей формулировке, кажется, заставило людей думать, что я атакую ​​саму концепцию СУБД.Я не;Я просто говорю, что встроенная поддержка локализации является крайне необходимой функцией.

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

Я приведу пример.Предположим, у меня есть очень тривиальная таблица для совершенно тривиального хранилища:

Products (id, price, description, name, slug)

В EF / MVC я добавлю это в конструктор ORM, возможно, инкапсулирую его в репозиторий, соберу контроллер Products иесть действия для индекса, деталей, создания, обновления, редактирования и удаления.Чтобы идентифицировать товар по любому из пунктов, я бы просто сделал ГДЕ (slug = @slug).Я бы сделал модель представления для действий создания / редактирования, разработал элемент управления формой и подключил его прямо к хранилищу.Сделано и сделано.Чтобы получить доступ к деталям для продукта, пользователь может перейти на /products/details/product-slug.

Но тогда, поскольку остальная часть сайта является двуязычной, я решаю соответствующим образом изменить таблицу продуктов.

Products (id, price)
ProductsText (productId, language, description, name, slug)

Эй, это не так плохо.Да еще нетЗатем вы пишете свои отношения и свои ограничения, а затем пишете, что вы записываете все свои свойства в view-модели, а затем вы делаете полный CRUD-контроллер для данных ProductsText или используете jQuery / Ajax для добавления кнопок создания / обновления / редактирования.на контроллере Products, а затем вы добавляете логику проверки, чтобы убедиться, что пользователь вводит хотя бы основной язык, а затем, когда вы хотите прочитать данные для страниц конечного пользователя, вы пишете другой запрос, чтобы присоединиться к ProductsText.slug и ProductsText.язык с продуктами ... Я, наверное, что-то упустил, но вы поняли.

Сложность программы просто взрывается с шаблонным кодом, если у вас есть локализация.

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

Редактировать 3: Кто-нибудь когда-нибудь слышал о службах моделирования SQL Server?В нем есть некоторые инструменты локализации , которые могут быть шагом в правильном направлении.Все еще ОСАГО, хотя.

-- Simulate the French locale with the SET LANGUAGE statement.
SET LANGUAGE French
select Id, CountryName, 
   [System.Globalization].[SessionsString](CountryName, 1) as CountryNameString
from [Location].[CountriesTable]

Ответы [ 6 ]

5 голосов
/ 05 августа 2010

Что такое поле локализованной базы данных?

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

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

В других «данных» локализация не имеет особого смысла, кроме как под руководством требований приложения. Например, даже если вы можете предлагать продукт в нескольких странах, SKU и дистрибьютор могут отличаться. Этот уровень локализации очень специфичен для конкретного приложения, и мы часто рассматривали его как отдельную базу данных, и на самом деле нет ничего связывающего эти индивидуальные базы данных по странам - многие продукты не были доступны, хотя в других странах могли существовать аналогичные продукты *. 1007 *

Если вы продаете одни и те же продукты по всему миру, то вы попадаете в первоначальный сценарий в виде многоязычной CMS. Это требует значительной работы помимо базы данных низкого уровня. Например, если кто-то исправляет описание продукта по умолчанию, что указывает переводчикам, что переводы также должны быть исправлены? Эти вопросы нетривиальны. Хотя я могу видеть, где поставщики баз данных могут помочь с функциями, это внутренние трудности требований приложений и дизайна, и не обязательно то, что база данных может добавить функции, которые будут универсально решать.

Проблема сопоставления действительно немного неловкая. Обычно данные хранятся в nvarchar, и вы не знали бы, какое сопоставление вы хотели получить для поиска во время написания хранимого процесса, поскольку языковой стандарт был бы параметром. Это влияет только на извлеченные коллекции, которые должны быть упорядочены по содержимому, обычно не по естественному ключу и, конечно, не по ключу - это не большая проблема, но она не может быть легко обработана без динамического SQL (приведение с использованием предпочтительного сопоставления из таблицы в зависимости от переданного местоположения, если вы смешиваете данные из разных локалей, вам придется решить, хотите ли вы сначала отсортировать по локали, а затем может быть трудно выбрать параметры сортировки, которые могли бы работать правильно во всех локалях в одном наборе результатов. ). Возможно, вы захотите использовать параметры сортировки Windows для такого большого разнообразия данных.

Аналогично с ORM мы обычно рассматривали составной уникальный ключ языкового стандарта / фразы как ключ для извлечения объектов (у нас обычно также был первичный ключ с суррогатной идентификацией) - я знаю, что традиционным ORM не обязательно нравится этот отход от поиска бессмысленным суррогатным ключом.

4 голосов
/ 05 августа 2010

Я сталкивался со всеми этими проблемами для локализованных веб-сайтов в стиле CRM. Не весело разрабатывать и оптимизировать, но это можно сделать. Моя 2 ¢ стоит:

1. В два раза больше CRUD.

Это зависит от того, как устроен ваш CRUD. Любая из моих хранимых процедур или функций, которые могут извлечь возможно локализованное поле, принимает параметр кода локали / культуры. Все эти поля также NVARCHAR, чтобы избежать проблем с кодировкой.

2. Нужен Ajax CRUD, если вы хотите прилично дружественный веб-интерфейс.

Полагаю, что так, но это зависит от приложения. Следует отнести к «внутреннему» CRUD (принцип СУХОЙ).

3. Проверка более чем в два раза - вам нужно убедиться, что отношение равно 1- *, а не 0 - *.

Это также предполагает, что весь контент требуется во всех поддерживаемых локалях, вместо использования резервного механизма. Например, содержимое MSDN от Microsoft доступно в нескольких локалях, но некоторые из них только в одной (обычно это американский английский, «нейтральная» локаль для Microsoft).

Для системы в стиле CRM любой языковой стандарт может использоваться для исходного контента, если резервный использует его, если нейтральный контент недоступен.

4. Различия в сопоставлении языков не учитываются.

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

5. Запросы требуют объединений.

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

6. Если вам нужны слизни на нескольких языках, о мальчик.

Это причина того, что параметры замены .NET в строке формата были разработаны для индексирования, а не для позиционирования (printf() и т. Д. Являются позиционными). Английский формат может нуждаться в заменах в порядке 1, 2, 3, тогда как в немецком эквиваленте используются 3, 1, 2.

Чтобы упростить жизнь локализаторам, всякий раз, когда я создаю пакет ресурсов .NET, я документирую параметры, включая индекс, тип данных (включая минимальную и / или максимальную длину строки) и контекстное описание - контекст важен для определения пола текста в некоторых регионах.

Множество может также потребовать нескольких связанных ресурсов, поскольку для некоторых локалей требуется больше, чем просто «один» и «множественное число» (например, «0 файлов», «1 файл», «2 файла»).

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

1 голос
/ 05 августа 2010

Ну, ответы пока не так полезны.У меня была такая же проблема на различных проектах, которые я делал в прошлом.И не было ни ярлыка, ни решения из коробки, которое помогло бы мне решить эту проблему простым способом.Но ваш подход движется в правильном направлении, и, немного поработав над уровнем доступа к данным, вы можете реально абстрагировать всю нагрузку, вызванную этим требованием.

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

Возможно, вы уже знаете эти страницы:

http://www.codeproject.com/KB/aspnet/LocalizedSamplePart2.aspx http://www.sisulizer.com/online-help/DatabaseLocalization.shtml Лучшие практики для локализации базы данных SQL Server (2005/2008)

0 голосов
/ 05 августа 2010

"и это, очевидно, такая же проблема с пользовательским интерфейсом, как и проблема с базой данных."

Я не согласен с этим.Если рассматривать вашу проблему под углом зрения базы данных, есть две вещи, которые могут послужить небольшим началом решения:

возможность выполнения полного обновления представления (как через JOIN, так и через GROUP, для вашего случая),возможность иметь атрибуты типа «таблица» внутри таблиц базы данных.После этого вы можете иметь весь набор применимых локализованных именных элементов в качестве атрибута sinle в одной строке для вашего продукта /...

Что касается обновления полного представления: не задерживайте дыхание.Вы задохнетесь задолго до того, как оно придет.

Что касается вложенных таблиц: они могут уже существовать, если у кого-то есть Oracle, я не знаю, но я не совсем уверен, что это будетдействительно облегчают жизнь с точки зрения пользовательского интерфейса.

Да, и кстати: SQL далеко не «теоретически чистый».

0 голосов
/ 05 августа 2010

«Многие работники баз данных работали над всевозможными теоретическими и практическими проблемами, но на удивление мало кто работает над этим».

Это потому, что в вашем примере не над чем работать, с теоретической точки зрения. Упоминаемые вами так называемые «проблемы» - все это не более чем прямое следствие того факта, что вы управляете большим количеством данных.

"В два раза больше CRUD."

И почему это проблема? Я знаю, по крайней мере, о нескольких построенных мной системах, в которых было намного больше, чем в вашем примере.

«Нужен Ajax CRUD, если вам нужен прилично дружественный веб-интерфейс».

Это действительно так? Я не знаю, но в любом случае, как данные обрабатываются на уровне представления, это не касается СУБД, и если программист считает, что это слишком сложно / громоздко, то не вините СУБД в этом.

Более чем вдвое больше проверки - вам нужно убедиться, что отношение равно 1- *, а не 0 - *.

И почему это проблема? Если указано больше бизнес-правил, требуется дополнительная проверка.

«Различия в сопоставлении языков не учитываются».

Как так? Какой смысл сопоставлять английский текст с французским? Английского текста с украинского или русского или китайского? Или ты имел ввиду что-то еще?

«Запросы требуют объединений».

И почему это проблема?

«Если вам нужны слизни на нескольких языках, о мальчик».

В каком контексте? С какой целью?

ВЫБРАТЬ язык, nllabel ОТ ... ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ (ВЫБЕРИТЕ «EN» в качестве языка UNION ВЫБЕРИТЕ «FR» в качестве языка)

Ой, подождите, я забыл ... СОЕДИНЕНИЯ - это тоже проблема.

0 голосов
/ 05 августа 2010

По моему опыту, я обычно не сталкивался с проблемой, когда данные, хранящиеся в базе данных, имеют много языковых версий одного и того же текста. Обычно разработанное приложение имеет много языковых файлов для всего текста, который более или менее статически встроен в приложение. Затем мы видим данные базы данных для ввода текстовых пользователей. Хотя пользователи могут использовать приложение на разных языках, ситуация, когда пользователи набирают один и тот же текст на нескольких языках, не столь распространена. Обычно пользователи приложения отображают пользовательский интерфейс на своем языке, а затем вводят и просматривают данные на своем языке.

Например, пользователи нашего приложения в США против Нидерландов или Саудовской Аравии увидят интерфейс на выбранном ими языке, но для любой конкретной установки вводимые данные будут постоянно на их родном языке.

Очевидно, что это относится не ко всем случаям. CRM - это пример, в котором у вас будет один и тот же текст с несколькими переводами, как в Википедии, но я думаю, что я описал выше, это более распространенный сценарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...