Схема базы данных FuelPHP ORM для i18n, мнения / предложения

Хотя этот вопрос может бытьаналогичный в много другиеЯЯ хотел бы спросить мнения / предложения о лучшем подходе для i18n специально для FuelPHP.

Итак, вот что яу нас так далеко:

Схема базы данных № 1:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en)

Пример данных № 1:

(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description')

Плюсы:

Прямо и простоОдин стол на модельНет необходимости использовать JOINИспользование магического метода для упрощения доступа к данным:

public function & __get($property)
{
    if (array_key_exists($property, array('name', 'description')))
    {
        $property = $property.'_'.Session::get('lang_code');
    }

    return parent::__get($property);
}

Сюда яя могу сделать звонок:

$model->name;
$model->description;

вместо:

$model->{'name_'.Session::get('lang_code')};
$model->{'description_'.Session::get('lang_code')};

Минусы:

Наличие большого количества языков / переведенных полей может стать беспорядочным.Добавление нового языка, подразумевает добавление новых полей в таблицуМагический метод работает только тогда, когда у нас уже есть экземпляр / объект ORM. Чтобы получить экземпляр ORM черезпостроитель запросов упорядочено переведенным полем этоS все еще требуется код, такой как:

Model_Model::query()
    ->order_by('name_'.Session::get('lang_code'))
    ->get();

Схема базы данных № 2:

languages (id, code, name)
models (id)
i18n_models (id, model_id, language_id, name, description)

Пример данных № 2:

-- languages
(1, 'pt', 'Português')
(2, 'es', 'Español')
(3, 'en', 'English')

-- models
(1)

-- i18n_models
(1, 1, 1, 'Modelo', 'Descrição do modelo')
(2, 1, 2, 'Modelo', 'Descripción del modelo')
(3, 1, 3, 'Model', 'Model description')

Плюсы:

Лучшая организация данныхДобавить новый язык совсем несложноКак и в первом подходе, мы также можем иметь прямой доступ к данным, используязадавать() метод для заполнения массива $ _custom_data:

$i18n = Model_I18n_Model::query()
    ->where('model_id', $model->id)
    ->where('language_id', Session::get('lang_code'))
    ->get_one();

$model->set(array(
    'name' => $i18n->name,
    'description' => $i18n->description
));

Минусы:

Сложность возрастаетJOIN или второй запрос должны быть использованыТребуется дополнительная таблица для каждой модели

Схема базы данных № 3:

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

Плюсы:

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

Минусы:

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

Лично я предпочитаю второй подход. Какие еще преимущества / недостатки вы видите? Кто-нибудь реализовал i18n по-другому на FuePHP? Поделитесь своими идеями :)

Ответы на вопрос(1)

Ваш ответ на вопрос