Как структурировать базу данных для простого мультиязычного сайта (PHP MySQL)? - PullRequest
0 голосов
/ 31 марта 2011

Я разработал сайт более года назад.Содержимое было / есть на двух языках, и теперь мне нужно создать управляемую базой данных систему обновления / вставки данных, чтобы они могли вставлять новости, события и т. Д. Наилучший подход для создания таблиц такой:

news_id         int(10) unsigned PK
lang_id         int(2)
status          tinyint(1)
title           varchar(255)
title_en        varchar(255)
title_es        varchar(255)
content         text
content_en      text
content_es      text
date_inserted   datetime
date_modified   datetime
type            varchar(45)
atach           text

затем создайте таблицу для языков

Ответы [ 2 ]

3 голосов
/ 31 марта 2011

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

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

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

`content` (The Table)
id
status
title
content
dataCreated
dateModified
owner

`contentTranslations` (The Table)
id
contentId (FK)
locale
title
content
dateCreated
dateModified

Теперь вам просто нужен способ узнать, какую локаль пользователь хочет использовать. Я предпочитаю использовать Zend_Locale для управления всеми моими локалями и Zend_Translate для short key => переводов значений. (Это не подходит для длинных переводов контента).

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

Красота

Однако прелесть всего этого состоит в том, что если вы не создали свой контент для конкретной языковой версии, то вы все равно можете использовать язык по умолчанию и перейти на базовый язык, на котором была написана оригинальная статья / контент.

SELECT c.id, c.status, c.title, c.content
FROM content as c
LEFT JOIN contentTranslations as t
ON c.id = t.contentId
WHERE c.id = 21231 AND t.locale = X
1 голос
/ 31 марта 2011

Хранение всего в одной базе данных - это путь, если у вас будет только два языка и если количество полей для конкретного языка невелико.

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

База данных "NEWS":

news_id         int(10) 
status          tinyint(1)
date_inserted   datetime
date_modified   datetime
type            varchar(45)
atach           text

База данных "TRANSLATIONS":

translation_id  int(10) 
news_id         int(10) 
lang_id         int(2)
title           varchar(255)
content         text

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

Кстати: поскольку я вижу, что тип является varchar (45), я полагаю, это также может быть связано с языком?

...