2010-09-23 3 views
1

J'ai 2 tables produitEst-ce une mauvaise conception de dupliquer des données dans la table de transaction?

Product 
-------- 
ProductID 
ProductName 

et SalesTransaction.

SalesTransaction 
-------- 
TransactionID 
ProductID 
ProductName 

état des besoins de l'utilisateur que « le nom du produit peut changer au fil du temps, mais cette modification ne doit pas avoir d'effet sur la transaction existent déjà ». Je veux savoir, mon design est-il bon pour ce genre d'exigence? Si non, comment améliorer mon design?

Répondre

2

Si l'exigence signifie que les anciennes transactions doivent conserver un enregistrement du nom du produit au moment de la transaction, alors oui, c'est un moyen d'y parvenir. Une autre méthode consiste simplement à modéliser le changement de nom d'un produit avec un nouvel ID de produit. Vous auriez besoin d'un champ supplémentaire dans votre tableau de produits pour marquer les enregistrements historiques. Lorsque le nom d'un produit change, il suffit de dupliquer l'enregistrement du produit avec un nouvel identifiant de produit et un nouveau nom, et de marquer l'ancien enregistrement comme historique.

0

Vous pouvez également diviser le produit en deux tables telles que Product et ProductDetail où ProductDetail stocke les éléments qui peuvent changer comme le nom et le prix. ProductDetail a également des colonnes de date From et To qui indiquent quand il était actif. Une fois qu'un enregistrement a été placé dans ProductDetail, la seule colonne qui peut changer est la date To, tout le reste est immuable. Lorsque le nom du produit change, insérez un nouveau ProductDetail et définissez la date de fin sur l'ancien.

Dans la table SalesTransaction, vous pouvez ensuite vous connecter à ProductDetail au lieu de Product et vous obtiendrez toujours le bon nom de produit.

1

C'est la méthode traditionnelle. Ce n'est pas une dénormalisation, mais plutôt une sauvegarde des informations requises à un moment donné. Don; t renoncer à faire la même chose avec les prix des articles dans l'ordre. Certaines personnes ne pensent pas faire cela (ce que vous devez faire pour ces types d'enregistrements si l'exigence le précise ou non) et créent un monde de mal pour eux-mêmes quand ils commencent à exécuter des rapports financiers de commandes parce que le prix attaché à la commande n'est plus le prix facturé au client.

+0

Je fais face à un problème, je ne peux pas suivre le nom du produit avec cette méthode. Je pense qu'il peut avoir une autre méthode plus élégante et plus robuste que celle-ci. – Anonymous

+0

Pourquoi ne pouvez-vous pas suivre le nom du produit, vous le stockez dans la table des transactions de vente? S'il vous plaît arrêtez d'essayer pour "l'élégance", "l'élégance" est sans valeur et est souvent activement nuisible aux oprations de base de données. La méthode la plus efficace est souvent ce qu'un programmeur d'application considère comme gênant. C'est une mauvaise chose en termes de base de données. – HLGEM

+0

Je sais que nous avons ces informations dans la table des transactions, mais pensez à la page principale. Si la transaction imprimée que le produit A a été vendu l'année dernière 3 mois plus tard A a changé son nom en B. Maintenant, le client est entré dans le magasin et demander le produit A, employy essayer de chercher ce produit à partir de la page principale . Dois-je interroger à la fois la table principale et la table de transactions? – Anonymous

Questions connexes