J’ai un petit problème avec le design de ma base de données pour un projet.
J’ai une application basée sur un produit central, appelons le “Produit” qui peut avoir plusieurs versions. Lorsqu’un utilisateur demande à créer une nouvelle version d’un produit, j’aimerais que l’ancienne version soit gardée dans son état (un champs permettra de dire que son statut n’est plus actif) et qu’une nouvelle version de ce produit soit créé, en incrémentant un numéro de version mais en copiant toutes les autres informations.
Si je résume, j’ai un produit qui a plusieurs informations (un nom, une date de création, un status, un vendeur et des coûts supplémentaires) et j’aimerais pouvoir faire du versionnement.
Après un peu de réflexion je suis arrivé à deux possibilités :
Produit (ProduitID, Nom, DateCreation, StatusID, VendeurID)
Status (StatusID, Nom) // le seul moyen que j’ai trouvé pour faire une énumération… qqn a une meilleure idée??
Vendeur (VendeurID, Nom, Prénom)
CoutSupp (CoutSuppID, Nom, Valeur, ProduitID)
Version (VersionID, ProduitID, VersionDate, Commentaire, PremierProduitID)
Où PremierProduitID est une clé étrangère liée à ProduitID de la table Produit
Produit (ProduitID, Nom, DateCreation, StatusID)
Status (StatusID, Nom) // le seul moyen que j’ai trouvé pour faire une énumération… qqn a une meilleure idée??
Vendeur (VendeurID, Nom, Prénom)
CoutSupp (CoutSuppID, Nom, Valeur, VersionID)
Version (VersionID, ProduitID, VersionDate, Commentaire, VendeurID)
Dans la première méthode, pour chaque nouvelle version j’aurais un nouvel enregistrement dans la table Produit et toutes mes informations correspondant à un produit seront dans la table produit, la table version ne contient que les informations correspondant à la version, comme son commentaire et sa date de création. Si je modifie les informations d’une version, ça ne modifie pas les informations des autres versions, on est bon. Par contre j’ai une clé qui est formée de deux champs dans la table version, ce qui n’est pas, je crois, normalisé et semble foutre un peu la m… avec mes objets Linq to SQL.
Dans la seconde méthode, j’aurais les informations sur mon produit splittées entre deux tables. Toutes les informations qui sont uniques à toutes les versions d’un produit sont dans la table produits. Les informations qui peuvent être variables entre les versions sont dans ma table Version. Je devrais faire un join pour avoir toutes les informations d’un produit particulier, mais il sera plus aisé de gérer ce qui doit identique pour toutes les versions d’un produit ou ce qui est pour une version particulière d’un produit.
Qu’est-ce que vous en pensez? Est-ce que par hasard qqn a une meilleure idée?
Edit: Ah oui, encore une chose. Pour les coûts supplémentaires et quelque autres tables du même genre, je dois aussi garder une sorte d’historique, c’est à dire que si je crée une nouvelle version d’un produit, je dois forcément recréer des coûts supplémentaires identiques à ceux qui étaient présents dans l’ancien produit et les lier à la nouvelle version.