Проектирование схемы базы данных для многоязычного веб-сайта
Возможный дубликат:
Каковы наилучшие методы для проектирования нескольких языков?
Я разрабатываю многоязычный веб-сайт, и я заинтересован в разработке схемы базы данных для него. Подумайте, есть таблица "Статьи"
Articles (Id, AddedByUser, AddedDate, Title, Description, Body, ViewCount).
Для реализации нескольких языков существует два пути.
Первый способ - создать одну таблицу
Articles (Id, AddedByUser, AddedDate, TitleRU, TitleEN, DescriptionRU, DescriptionEN, BodyRU, BodyEN, ViewCount).
Второй способ - создать три таблицы
Articles (Id, AddedByUser, AddedDate, ViewCount).
ArticlesLocalized(Id, ArticleId, Title, Description, Body, LanguageId)
Languages(Id, Name)
Какой способ лучше?
Ответы
Ответ 1
Несколько таблиц - это, безусловно, путь. Это упростит запросы (вы сможете использовать полностью параметризованные запросы - ex "… WHERE language=?"
- вместо того, чтобы конкатенировать строки - ex "SELECT Title" + lang_code
), это упростит добавление новых языков (если это применимо), и вы у меня будут теплые нечеткие чувства от нормальных нормализованных данных (я мог ошибаться, но я считаю, что опция с несколькими столбцами нарушает 1NF).
Кроме того, если бы я разрабатывал схему, я бы не стал беспокоиться о таблице Langauges
и вместо этого сохранил два (или, возможно, пять) кода языка символов вместе с каждым ArticlesLocalized
. Накладные расходы на хранение и сравнение будут минимальными, они не будут нарушать какие-либо правила нормализации, и это сделает отладку гораздо менее болезненной.
Ответ 2
Я согласен с Дэвидом. Также вы можете подумать, что делать, если отсутствует требуемый язык. Возможно, сделайте LEFT JOIN с ArticlesLocalized
и установите параметр "default language" в Languages
, чтобы получить что-то, даже если статья не была переведена.