J'ai un certain nombre de tables de base de données contenant Cependant, cette solution nécessite une nouvelle table code> locale _ code> pour chaque tableau contenant 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: p> pays strong> p> localisation strong> p> locale forte> p> Notez que la clé primaire composée de la localisation code> de la table code> est 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? P> Mise à jour: strong>
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 code> localization_id code> ne font référence que partie de la clé primaire correspondante dans la localisation merci,
Don p> p> nom code> et
description code> 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:
Nom code> et description colonnes nécessitant
localisation code>. Dans une tentative d'éviter cette surcharge, j'ai redessiné le schéma de sorte que seule une seule localisation code> est nécessaire p>
(id, locale_id) code>, mais La clé étrangère dans le produit code> code> fait référence uniquement au premier élément de ce composé pk. Cela semble être comme une «mauvaise chose» du POV de normalisation. P>
code> table. p>
4 Réponses :
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: P>
produit b> p> localisation du produit b> p> locale b> p>
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 i> ne nécessitera qu'un nom et une description à localiser
Je pense que ça va bien. Vous décrivez une relation une-à-plusieurs entre un produit et son texte de localisation. P>
Je me demande si vous devez également localiser l'anglais au lieu de la dénormaliser dans votre table de produits. P>
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.
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> produit_translations p> 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';
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.
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 p> produit p> localisation p> locale p> 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). P> 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à). p> 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). P> p>
"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