1

Je sais que ce n'est pas exactement normalisé, mais en apportant toutes les données localisées dans mon l'application dans juste quelques tables m'aidera beaucoup.Comment puis-je concevoir une table de contenu localisée qui peut se joindre à un certain nombre de tables différentes (la relation doit être générique ...)

Je dois être capable de lier une table générique à une table LocalisedContent qui contiendra des lignes différentes pour chacune des paires clé-valeur localisées de la table générique qui lui est associée ... Je suppose que vous pourriez dire que ça va être une relation un-à-plusieurs.

Le problème que j'ai trouvé est que je ne suis pas sûr de savoir comment mieux ... ce modèle que je peux penser à deux voies et je ne suis pas sûr que l'on est le mieux:

Ma première option est:

AnExampleOfAGenericTable 
------------ 
AnExampleOfAGenericTableID 
...other non-localised data... 

AnotherGenericTable 
------------ 
AnotherGenericTableID 
...other non-localised data... 

LocalisedContent 
---------------- 
LocalisedContentID 
genericTablePKName 
GenericTableID 
LanguageID 
field 
content 

Dans ce qui précède, il serait possible de sortir un contenu localisé pour une table générique avec une requête SQL comme:

SELECT AnExampleOfAGenericTableID, field, content 
    FROM AnExampleOfAGenericTable LEFT JOIN LocalisedContent 
    ON AnExampleOfAGenericTable.AnExampleOfAGenericTableID =   
    LocalisedContent.GenericTableID 
    WHERE genericTablePKName = 'AnExampleOfAGenericTableID' 

Ou:

SELECT AnotherGenericTableID, field, content 
    FROM AnotherGenericTable LEFT JOIN LocalisedContent 
    ON AnotherGenericTable.AnotherGenericTableID = LocalisedContent.GenericTableID 
    WHERE genericTablePKName = 'AnotherGenericTableID' 

La deuxième option semble être, quelque chose comme:

AnExampleOfAGenericTable 
------------ 
AnExampleOfAGenericTableID 
...other non-localised data... 
localisedGroupID 

AnotherGenericTable 
------------ 
AnotherGenericTableID 
...other non-localised data... 
localisedGroupID 

LocalisedContent 
---------------- 
LocalisedContentID 
localisedGroupID 
LanguageID 
field 
content 

Et puis je pourrais utiliser une requête SQL comme:

SELECT AnExampleOfAGenericTableID, field, content 
FROM AnExampleOfAGenericTable LEFT JOIN LocalisedContent 
ON AnExampleOfAGenericTable.localisedGroupID = LocalisedContent.localisedGroupID; 

Ou:

SELECT AnotherGenericTableID, field, content 
FROM AnotherGenericTable LEFT JOIN LocalisedContent 
ON AnotherGenericTable.localisedGroupID = LocalisedContent.localisedGroupID; 

La deuxième L'option me semble plus concise, mais elle me demande de rejoindre deux FK qui me paraissent un peu étranges. Cela nécessite également beaucoup de colonnes 'localisedGroupID' supplémentaires. En fin de compte, les deux exemples que j'ai donnés peuvent être faux et je n'ai pas l'expertise nécessaire pour connaître la meilleure solution à ce problème. (Avant de signaler que ceci n'est pas entièrement normalisé, j'ai déjà dit que je ne veux pas des centaines de tables de données localisées différentes pour chacune de mes tables ... Je veux une certaine centralisation de la localisation même si elle va me perdre un peu d'intégrité référentielle.)

Des idées?

Répondre

1

Votre schéma me rappelle les exemples de "modélisation relationnelle de spécialisation de généralisation" disponibles sur le web, avec une différence importante. Ce que vous appelez AnExampleOfAGenericTable et AnotherGenericTable correspondent aux tables spécialisées du modèle gen-spec, et ce que vous appelez LocalisedContent correspond à la table généralisée dans le modèle gen-spec.Si je vous ai bien compris chaque entrée dans les deux premières tables va avoir une contrepartie dans la table LocalisedContent, mais une entrée dans la table LocalisedContent va avoir une contrepartie dans une seule des deux autres tables . C'est exactement le même modèle que gen-spec, seulement en arrière.

Dans la conception gen-spec, vous utilisez la même PK dans toutes les tables spécialisées que vous utilisez dans la table généralisée. Cependant, le PK dans une table spécialisée est également un FK à la table généralisée. Et, bien sûr, vous n'utilisez que la fonction autonumber dans la table gen.

Il n'y a rien d'anormal à propos de gen-spec en tant que tel.

+0

Désolé pour le délai imparti. Très bonne réponse; m'a donné quelque chose à lire! :) – olive

0

Nous utilisons les éléments suivants:

LocalizedContent:

Id - identity 
Key - format 'TableName.ColumnName' 
Value - localized value 
LanguageId - reference to the languageid 
TableRowId - generic table row id 

Où clé au format utilisation 'nomtable.nomcolonne'

:

SELECT IFNULL(lc1.Value, name) as Name, 
     IFNULL(lc2.Value, Description) as Description 
From GenericTable t 
LEFT JOIN LocalizedContent lc1 
    ON (lc1.TableRowId = t.Id AND Key = 'GenericTable.Name' And LanguageID = YourLangId) 
LEFT JOIN LocalizedContent lc2 
    ON (lc2.TableRowId = t.Id AND Key = 'GenericTable.Description' And LanguageID = YourLangId) 

GenericTable est (Id, Nom , Description)