8
votes

Localisation de la base de données

J'ai un certain nombre de tables de base de données contenant nom et description des colonnes qui doivent être localisées. Ma dernière tentative de conception d'un schéma de base de données qui appuierait ceci était quelque chose comme: xxx

Cependant, cette solution nécessite une nouvelle table locale _ pour chaque tableau contenant Nom et description colonnes nécessitant localisation . Dans une tentative d'éviter cette surcharge, j'ai redessiné le schéma de sorte que seule une seule localisation est nécessaire xxx

Voici un exemple de données qui seraient Soyez stocké dans ce schéma lorsqu'il y a 2 tables (produit et pays) nécessitant la localisation:

pays xxx

Produit xxx

localisation xxx

locale xxx

Notez que la clé primaire composée de la localisation de la table est (id, locale_id) , mais La clé étrangère dans le produit fait référence uniquement au premier élément de ce composé pk. Cela semble être comme une «mauvaise chose» du POV de normalisation.

est-ce que je peux résoudre ce problème, ou alternativement, existe-t-il un schéma complètement différent qui prend en charge la localisation sans créer de table séparée pour chaque Table localisable?

Mise à jour: Un certain nombre de répondants ont proposé une solution qui nécessite de créer une table séparée pour chaque table localisable. Cependant, c'est précisément ce que j'essaie d'éviter. Le schéma que j'ai proposé ci-dessus résout presque le problème à ma satisfaction, mais je suis mécontent du fait que les touches étrangères localization_id ne font référence que partie de la clé primaire correspondante dans la localisation table.

merci, Don


2 commentaires

"Mais je suis mécontent du fait que les touches étrangères de localisation_id ne font référence que partie de la clé primaire correspondante dans la table de localisation". Je ne vois pas le problème, il y a une relation à beaucoup de produits à la localisation, la structure de la base de données suit les exigences, vous avez trouvé une bonne solution.


Cela devrait être affiché sur dba.stackexchange.com


4 Réponses :


1
votes

La bonne façon, je me sens, serait de créer une table supplémentaire, mais puis de passer à l'étape supplémentaire et de supprimer toutes les ressources spécifiques de la langue de la première table.

Donc, vous auriez:

produit xxx

localisation du produit xxx

locale xxx


3 commentaires

Ce schéma ne fonctionnera pas quand il y a plus d'une table contenant du contenu localisable


Vous aurez besoin d'une table supplémentaire par contenu local. Je ne pense pas que vous puissiez vous déplacer. Certaines tableaux localisables peuvent ne pas avoir de noms ni des descriptions, vous voyez ou plus de champs nécessitant des traductions. Ceci fait bien sûr la pause des meilleures pratiques pour les normalisations. Utilisez les tables supplémentaires.


Dans ce cas, il est prudent de supposer que chaque table localisable ne nécessitera qu'un nom et une description à localiser



3
votes

Je pense que ça va bien. Vous décrivez une relation une-à-plusieurs entre un produit et son texte de localisation.

Je me demande si vous devez également localiser l'anglais au lieu de la dénormaliser dans votre table de produits.


2 commentaires

J'ai modifié le schéma pour incorporer votre suggestion


L'ensemble de la localisation est qu'il existe une relation unique entre la "chose" et le nom. Il en résulte donc naturellement qu'une référence dans la table "Thing" ne peut pas être une clé primaire complète du tableau de localisation, car cela contraindrait la relation à un à un. La manière la plus courante de faire une relation à plusieurs à une consiste à poster l'identifiant de la fin de «une» bout en bout «Beaucoup», mais vous auriez un problème de faire cela ici, car la table de localisation devait alors avoir à Référencez de nombreuses tables différentes, ce qui permet de faire une référence de clé étrangère désordonnée et sans forme.



1
votes

Si je comprends bien, votre problème est seulement parce que vous souhaitez utiliser la même localisation de Langua pour nom et la même description dans plus d'une table. Dans un tel scénario, vous ne pouvez pas ajouter le prod_id dans la table de localisation. Un problème de plus dans votre conception est qu'il ne peut pas gérer plus d'une localisation de la langue pour le même produit avec élégance. Vous pouvez le modifier pour travailler:

Si le nom et la description sont les seuls champs qui nécessitent la localisation, vous pouvez effectuer ce qui suit. P>

produit (ID, nom, description, tangation_row_id) p> Produit_translations (identifiant, nom, description, lang_id, traduction) p>

La traduction_row_id sera une clé étrangère pointant vers le produit_translations.id Le traduction_Id fera toutefois signaler un enregistrement parent dans le même tableau qui servirait d'enregistrement commun pour tous les enregistrements spécifiques à la langue. p>

Exemple d'enregistrements p>

produit p> xxx pré>

produit_translations p> xxx pré>

Code de la langue, vous pouvez extraire les valeurs Nom et Description à l'aide de la requête FOLL SQL P>

select T.name, T.description
from product_translations T 
where T.translation_id = 
     (select T2.ID 
      from Product P,Product_translations T2 
      where P.translation_row_id = t2.ID
      ) 
     and T.lang_id = '&langID';


1 commentaires

Grande suggestion, je pourrais donner cela un essai. Cependant, je vais probablement supprimer le nom et la description du produit (et d'autres tables localisables), car il semble être redondant. En outre, la table destranslations de produits devrait être appelée quelque chose de plus générique comme des «traductions», car en réalité contiendra des pays localisés, des produits, etc.



2
votes

J'aime l'idée, mais j'irais une étape dans l'autre direction et une entrée de localisation pour chaque colonne traduite:

pays xxx

produit xxx

localisation xxx

locale xxx

le pc de La localisation est (id, locale_id). Ce n'est pas un problème que l'identifiant est également une référence FK dans plusieurs autres tables. Vous pouvez ajouter un PK de substitution si vous voulez, tant que vous avez toujours un index unique sur (id, locale_id).

La bonne chose à ce sujet est que c'est une table de localisation unique, et cela fonctionne pour toute table de votre schéma, quels que soient les champs qu'il a (vous n'êtes pas limité à avoir le nom et la description de tout ce que devient localisé). L'inconvénient est une performance potentielle lors de l'utilisation du tableau de localisation - bien que potentiellement, vous pouvez simplement vous cacher le tout pour un LOCAL_ID donné, alors lorsque vous recherchez des entrées, il vous suffit de rechercher l'identifiant donné (puisque votre cache est Keyed basé sur la langue déjà).

Vous pouvez également envisager de partir dans les champs de nom et de description par défaut dans la table des produits, qui seraient utilisés dans le cas d'une entrée manquante pour la langue actuelle ou lors de la saisie, L'utilisateur n'a pas spécifié la langue. Ce serait également le cas si vous portez une application existante, vous auriez déjà des valeurs là-bas (sans informations de localisation).


0 commentaires