До сих пор было несколько вопросов по этому поводу, и все они пришли к одному и тому же ответу: одна таблица для данных, не зависящих от языка, 1- * к таблице с переводами и индексированным полем идентификатора языка..
У этого есть несколько проблем:
- В два раза больше CRUD.
- Потребность в Ajax CRUD, если вам нужен прилично дружественный веб-интерфейс.
- Более чем вдвое больше проверки - вам нужно убедиться, что отношение равно 1- *, а не 0 - *.
- Различия в сопоставлении между языками не учитываются.
- Запросы требуют объединений.
- Если вам нужны слизни на нескольких языках, о боже.
Многие специалисты по базам данных работали над всевозможными теоретическими и практическими проблемами, но на удивление мало кто работает над этим.
Я думаю, что в конечном итоге нам нужно:
- Тип поля, в котором будут храниться несколько версий строк
- Несколько индексов для каждого такого поля, один длякаждый язык или 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]