2010-10-15 8 views
1

Je cherche un bon moyen de mettre en œuvre - les caractéristiques par défaut pour un objet et de remplacer les valeurs par défaut dans une base de données.Modèle de conception de base de données pour l'héritage/overrides

J'ai une table appelée Produits - qui maintient la liste des produits L'un des produits est boîte aux lettres et la valeur de la couleur d'attribut est bleu j'ai besoin la possibilité de spécifier cette boîte aux lettres est rouge lorsque le pays est au Royaume-Uni Plutôt que de créer une ligne pour chaque pays que je veux pouvoir dire s'il n'y a pas d'entrée pour le pays, utilisez les valeurs par défaut.

Je dispose de plusieurs produits dans le tableau des produits

TIA

Répondre

2

Que diriez-vous de cette solution:

Products(#product_id,...,color) 
ProductLocalization(#country_id,color,...) 

Vous pouvez également créer une vue de simplifier l'accès aux données:

CREATE VIEW LocalProducts 
AS 
SELECT p.product_id,...,country_id=[default],p.color 
FROM Products p 
UNION ALL 
SELECT p.product_id,...,pl.country_id,pl.color 
FROM Products p, ProductLocalization pl 

L'espace réservé [par défaut] doit être une valeur par défaut dépend du type de données country_id. Il peut s'agir d'un 'défaut' pour le type varchar ou d'un 0 pour le type int (et l'identifiant valide des pays réels doit être compris entre 1 et N).

Lorsque vous devez localiser des produits pour un pays, vous allez simplement ajouter un enregistrement des fonctionnalités du produit dans la table ProductLocalization avec un ID de pays spécifique.

+0

Je veux m'assurer de comprendre ce que vous suggérez. Dans cette solution, la valeur par défaut dans la première requête représente la valeur pour le reste du monde tandis que la seconde requête fournit des valeurs spécifiques au pays. La deuxième requête ne devrait-elle pas avoir une condition de jointure - O WH p.product_id = pl.product_id? – shikarishambu

+0

Cela dépend de vos besoins. Si les valeurs spécifiques au pays sont appliquées à chaque produit, la requête ci-dessus est correcte. Si certaines valeurs spécifiques à un pays sont appliquées à un produit spécifique, une colonne product_id doit être ajoutée dans la table ProductLocalization et la clé primaire de cette table doit être (product_id, country_id), la seconde requête doit avoir une condition de jointure comme tu l'as écrit. –

+0

Vous ne devez pas supposer qu'une valeur par défaut signifie que la valeur n'a pas été remplacée. Ce type d'ambiguïté conduit à un désordre de la valeur par défaut qui change jamais. Si une valeur par défaut change, devez-vous mettre à jour les tables enfant avec la nouvelle valeur par défaut? Que faire si une ligne a surchargé la valeur par défaut avec la même valeur ... donc changer la valeur à la nouvelle valeur par défaut serait mauvais. – Chaos

0

Si vous utilisez un DMBS qui a déclencheurs cela pourrait être un bon moment pour les utiliser.

J'attribuerais une valeur par défaut à la colonne de couleur mais un déclencheur qui vérifie le pays sur l'insertion et peut remplacer cette valeur par défaut si nécessaire.

0

La question est très ouverte. Quel SGBD utilisez-vous? Avez-vous un mot à dire sur la conception des tables en jeu en dehors de la valeur par défaut? Si oui, je suggérerais de penser à un nouveau design puisque vos associations ne permettent pas les contraintes que vous devez activer. Peu importe ce que vous faites, il semble que vous cherchiez à placer la logique dans les valeurs par défaut, ce qui est un peu peu orthodoxe.

Ma suggestion est de placer cette logique dans l'application ou, dans le pire des cas, dans un déclencheur comme Abe suggéré.

+0

Je souhaite que la solution soit indépendante de la base de données. Par conséquent, le déclenchement ne fonctionnera pas pour moi – shikarishambu

Questions connexes