3

Je l'ai fait de plusieurs façons maintenant. J'aimerais savoir s'il y a un bon schéma pour ça.Modèle de conception db pour une structure de données multilingue dynamique

Un système a un contenu dynamique. Ainsi, non seulement la quantité de données et les données elles-mêmes sont dynamiques (nombre (lignes)), mais le nombre de champs est également dynamique. Donc un blog peut avoir 10 champs à traduire, mais un article de panier a 5.

Ce que j'ai fait est d'insérer un identifiant pour une ligne de table qui contient les données de langage pour ce champ. Cette table de langue a l'id, defaultlanguage, plus n'importe quel nombre de langues supplémentaires. De cette façon, il n'y a qu'une seule table de langue.

Cela est très pratique, mais je ne peux pas mettre à jour les vues car lorsque plusieurs jointures font référence à la même table, elles ne peuvent pas être mises à jour (MySQL). Alors peut-être il y a beaucoup de meilleures façons de le faire.

Y a-t-il un meilleur design? Quels sont les modèles de conception courants utilisés dans cette situation?

Répondre

1
  • Entité FieldTypes (ID, Nom)
  • Entité Les champs (ID, Nom, FieldType)
  • Entité FieldValues ​​ (ID , CollectionID, Champ, Valeur)
  • Entité Contenu (ID, Les champs, données)
  • Entité i18n (ID, Champ, LanguageID, Valeur)

Exemple:

insert into FieldTypes('S', 'string'); 
insert into FieldTypes('DT', 'date/time'); 

insert into Fields(1, 'Author', 'S'); 
insert into Fields(2, 'Created', 'D'); 

insert into i18n(1, 1, 'en', 'Author'); 
insert into i18n(2, 1, 'ru', 'Автор'); 
insert into i18n(3, 2, 'en', 'Created'); 
insert into i18n(4, 2, 'ru', 'Создано'); 

insert into Content(1, 2, 'Test data'); 
insert into FieldValues(3, 2, 1, 'Tester'); 
insert into FieldValues(4, 2, 2, '2011-03-20T12:20:00'); 

/* Display content fields in the user language */ 
select c.ID, f.ID, i.Value as FieldName, fv.Value as FieldValue 
from Content c, FieldValues fv, Fields f, i18n i 
where c.Fields = fv.CollectionID 
    and fv.Field = i.Field 
    and i.LanguageID = :UserLanguage 
    and c.ID = :ContentID 
+0

Pouvez-vous expliquer cela s'il vous plaît. Cette table contient-elle toutes les données de traduction pour beaucoup d'autres tables? –

+0

La table "i18n" contient les données de traduction pour de nombreux champs personnalisés du contenu du site (articles de blog, nouvelles, articles, etc.). – vemcaster