Этот вопрос касается вопроса, несколько более сложного, чем тот, который уже был рассмотрен в этих старых вопросах, каждый из которых является дубликатом друг друга:
Предложение по структуре базы данных для мультиязычности (2011 г. июнь)
Какова лучшая структура базы данных для хранения многоязычных данных? (Февраль 2010 г.)
Каковы лучшие практики для проектирования многоязычных баз данных? (Май 2009 г.)
Схема для мультиязычной базы данных (2008 ноябрь)
Кажется, что наиболее популярная схема базы данных для поддержки многоязычных пользовательских интерфейсов состоит в том, что все переведенные тексты всех языков в одной таблице с 3 столбцами: идентификатор текста, код языка и сам текст. Текстовый идентификатор и код языка вместе составляют первичный ключ.
Это все очень хорошо, но теперь рассмотрим усложнение: предположим, что тексты должны быть доступны для поиска. Предположим, например, что это многоязычный интернет-магазин. Это означает, что для каждой категории продуктов, введенной в базу данных, владелец магазина будет вводить название категории продукта на каждом из N поддерживаемых языков, а затем покупатель сможет искать категорию продукта по имени, на своем родном языке .
Есть проблема: сопоставление .
Разные языки имеют разные последовательности сортировки, а последовательность сортировки, которая работает для одного языка, не работает для другого. Итак, если все тексты всех языков находятся в одном столбце, какую последовательность сортировки они будут иметь? Как мы собираемся запросить базу данных, чтобы найти текстовый идентификатор конкретного текста? В то время как в веб-продукте точность поиска и производительность могут быть не очень важны, для целей этого обсуждения давайте предположим, что они действительно имеют значение.
Большинство администраторов баз данных знакомы с понятием сопоставления в смысле «сопоставления базы данных». К счастью, это просто сортировка по умолчанию, которая используется, если нет никакой другой информации, но есть и другие места, где можно указать параметры сортировки:
Команда SQL CREATE INDEX поддерживает спецификацию сопоставления. (Хотя ходят слухи, что Microsoft SQL Server его не поддерживает; кто-нибудь знает об этом?)
Оператор SQL SELECT также поддерживает параметры сортировки, но в этом случае спецификация параметров сортировки работает как функция, вызывая сканирование индекса вместо поиска индекса, что может быть недопустимо, если мы хотим повысить производительность. (Опять же, если это лучшее, что мы можем иметь, это может быть лучше, чем ничего.)
Я также слышал, что в Microsoft SQL Server у вас могут быть непостоянные вычисляемые столбцы, в которых вы можете указать параметры сортировки и создать отфильтрованный индекс, хотя я никогда не слышал об этом раньше, и если это только Microsoft-SQL-Server Я бы предпочел воздержаться от его использования, независимо от того, насколько он крут и продуман.
Итак, в свете всего этого, как мы структурируем нашу базу данных и как мы выполняем наши запросы, если целью является обновляемая и доступная для поиска многоязычная база данных?
Этот вопрос был вдохновлен обсуждением, состоявшимся здесь: как nvarchar (max) будет хранить данные в базе данных, будет ли это быстро, если некоторые данные будут содержать менее 4000 символов?