FuelPHP ORM-Datenbankschema für i18n, Meinungen / Vorschläge

Während diese Frage sein könnteähnlich zu viele AndereIch möchte um Meinungen / Vorschläge zum besten Ansatz für i18n speziell für FuelPHP bitten.

Also, hier ist was ich bisher habe:

Datenbankschema 1:

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

Beispieldaten # 1:

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

Vorteile:

Geradlinig und einfachEin Tisch pro ModellJOIN muss nicht verwendet werdenVerwendung einer magischen Methode zur Vereinfachung des Datenzugriffs:

 

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

    return parent::__get($property);
}

Auf diese Weise kann ich anrufen:

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

anstatt:

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

Nachteile:

Wenn viele Sprachen / übersetzte Felder vorhanden sind, kann dies zu Problemen führen.Wenn Sie eine neue Sprache hinzufügen, müssen Sie der Tabelle neue Felder hinzufügenDie magische Methode funktioniert nur, wenn wir bereits eine ORM-Instanz / ein ORM-Objekt haben. So rufen Sie eine ORM-Instanz über dieAbfrage Ersteller Von einem übersetzten Feld bestellt, wird weiterhin ein Code benötigt wie:

 

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

Datenbankschema 2:

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

Beispieldaten # 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')

Vorteile:

Bessere DatenorganisationDas Hinzufügen einer neuen Sprache ist ein KinderspielWie im ersten Ansatz können wir auch über den direkten Datenzugriff verfügeneinstellen() Methode zum Auffüllen des Arrays $ _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
));

Nachteile:

Die Komplexität steigtEs muss ein JOIN oder eine zweite Abfrage verwendet werdenFür jedes Modell ist eine zusätzliche Tabelle erforderlich

Datenbankschema 3:

Bei anderen Fragen wurde die Verwendung einer zentralen i18n-Tabelle für alle Übersetzungen vorgeschlagen, wobei für jede Übersetzung eines Modells eine Zeile verwendet wurde.

Vorteile:

Einzelne Tabelle für i18n, die von den Modellen gemeinsam genutzt wirdDas Hinzufügen einer neuen Sprache sollte wie im vorherigen Ansatz einfach sein

Nachteile:

Die Komplexität beim Abrufen von Daten steigt, sodass für jeden übersetzten Text eines Modells ein JOIN erforderlich istWir könnten es versuchenEAV-Behälter Bei diesem Ansatz wird zwar ein Schlüssel / Wert für die Zuordnung verwendet, in diesem Fall müssen wir jedoch auch die language_id verwenden, um die richtige Übersetzung abzurufen.

Ich persönlich bevorzuge den zweiten Ansatz. Welche weiteren Vor- / Nachteile sehen Sie? Hat jemand i18n anders auf FuePHP implementiert? Teilen Sie Ihre Ideen :)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage