Problème de Foreign Keys et relations

DieInPain62 Messages postés 31 Date d'inscription lundi 23 juin 2014 Statut Membre Dernière intervention 11 juin 2015 - 3 août 2014 à 03:39
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 - 12 sept. 2014 à 15:26
Bonjour,

Dans le cadre d'un projet, j'ai dû réaliser une BDD.

Ayant déjà posté quelques posts concernant ce projet, voici la description du projet que j'avais déjà donné.


L'application que je dois réaliser est une sorte de répertoire regroupant tous les fournisseurs d'une entreprise ainsi que leurs produits, leurs coordonnées (un fournisseur pouvant avoir plusieurs coordonnées différentes, selon le contact), etc.


En bref, les produits sont repartis dans plusieurs sous-familles. Un fournisseur peut faire partie de plusieurs sous-familles selon ses produits (Admettons qu'un fournisseur fournisse un produit 1 appartenant à la sous-famille A et un produit 2 appartenant à la sous-famille B, on considère que le fournisseur appartient à ces deux sous-familles si vous voyez ce que je veux dire).

Ainsi, le menu principal de l'application devrait afficher une arborescence (à la manière des dossiers dans Windows, un TreeView c'est ça ?) permettant de déployer les sous-familles puis de cliquer sur le fournisseur souhaité. De plus, plusieurs boutons sont affichés dans ce menu, permettant d'accéder à des fenêtres de recherche par fournisseur/produit/sous-famille.

Dans le cas de la recherche par fournisseur et sous-famille, une ListBox est triée pour affiché le/les fournisseurs par rapport à un choix effectué dans un ComboBox.

Dans le cas de la recherche par produit, une fois le choix fait dans le ComboBox, une fenêtre contenant une ListBox s'affiche en indiquant tous les fournisseurs proposant le produit choisi.

Une fois le fournisseur choisi (via la recherche ou l'arborescence), une fenêtre sera affichée et regroupera ses différents contacts (responsable, commercial, secrétaire, etc.) ainsi que leurs coordonnées (+ en cliquant sur l'adresse mail, on devrait directement pouvoir envoyer un mail). Je pense, ici, les afficher sous forme d'onglets, un onglet correspondant à un contact.

Dans cette même fenêtre devrait figurer une liste des produits (sans doute dans un tableau). Ce tableau disposera d'une colonne « Libellé » mais également « Fiche technique » qui devrait permettre de télécharger un fichier PDF ou d'en uploader un si ce n'est pas déjà fait (est-ce que cela est possible ?) en sachant que chaque produit disposera d'une ou plusieurs (si la si le fournisseur fournit plusieurs marques pour un même produit) fiche(s) technique(s) pour un fournisseur donné (et donc, la/les fiche(s) technique(s) sera/seront différente(s) selon le fournisseur, même si le produit dispose du même libellé).

Enfin, il sera possible d'ajouter/modifier/supprimer les produits, familles, sous-familles, fournisseurs mais seulement pour DEUX utilisateurs. Ainsi, je vais devoir créer un formulaire d'authentification pour que tout le monde ne puisse pas modifier les données.

Le but de l'application est d'être le plus simple possible, le plus accessible. Donc je me limite à ce qui a été demandé.



J'ai décidé d'utiliser VB.NET (via Visual Studio 2013) pour l'application et SQL Server (avec SQL Server Management Studio) pour la BDD.

Voici le schéma de ma BDD:




J'ai un petit problème. J'ai pas mal de difficultés en développement et de la même manière, ça fait longtemps que je n'ai pas été amené à réaliser une BDD donc les notions de relations, de FK, etc. ce n'est plus que c'était. D'autant plus que le projet est urgent (retard provoqué par d'autres projets qui se sont ajoutés).

De ce fait, il y'a quelques petits détails que j'ai du mal à comprendre.

J'ai utilisé, comme c'est indiqué sur le schéma, les IDs en tant que FK, comme j'ai pu le voir sur pas mal de tutos. Mais j'ai commencé à ajouter quelques données afin de faire des tests et je me rend compte que quand je dois, par exemple, ajouter un Contact, je dois rentrer l'ID correspondant au Fournisseur auquel le Contact appartient, ce qui n'est pas pratique.
Je pense notamment au moment où la BDD sera complétée avec des dizaines/centaines de Fournisseur, je serais sans doute amené à importer les données via un fichier Excel, je devrais donc chercher systématiquement l'ID du Fournisseur ?

De la même manière, j'ai utilisé une JUNCTION TABLE pour la relation Many-to-many. A chaque fois que je voudrais faire correspondre un Fournisseur à un Produit, vais-je être obligé de chercher l'ID du Produit et l'ID du Fournisseur afin de les indiquer dans la table ProduitFournisseur ?


Merci d'avance pour le temps que vous m'accorderez.

Cordialement.

1 réponse

BasicInstinct Messages postés 1470 Date d'inscription mardi 5 février 2002 Statut Membre Dernière intervention 20 octobre 2014 12
11 sept. 2014 à 13:37
pour ce genre de problématique, il faut se poser la question du sens. Je m'explique :
Un contact n'appartenant à aucun fournisseur a-t-il un sens ?
Un Produit sans fournisseur ?

La réponse peut varier selon le besoin. Mais si la réponse est non, alors il faut une FK comme tu l'as fait. (j'ai pas lu le schéma, juste les explications)

Tu peux tout a fait décidé de supprimer les relations pour facilité les traitements (des BDD sans relation j'en ai vu plein). Mais se posera alors le problème de la fiabilité des données..

La réponse souvent entendue est : c'est le soft qui fera les contrôles. Qu'advient-il de cette réponse quand le base se complexifie, que les développeur défile sur la maintenance du soft ? Que d'autres soft viennent exploiter la même base ? etc....

tout ça pour dire que oui, il faut les FK en base. et j'ajouterai que non, ça ne signifie pas supprimer tous les contrôles dans l'application.

Pour ce qui est de l'import, il faudra retravailler les données pour inclure la récupération des id correspondant : Mr machin de la société bidule => Bidule existe, je récupère son id, sinon je créé bidule avant d'insérer machin....
Et tu arriveras les problématique de gestion de doublon. mais ça c'est une autre histoire :D
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
12 sept. 2014 à 13:59
Salut,

Je rajouterai une petite info qui pourrait t'interesser : tu peux avoir une clef etrangère nullable, c'est à dire que si une valeur sera indiqué, elle devra exister (par exemple lors de la création d'un produit, si on donne un id fabriquant, celui-ci doit exister), mais ca te permet d'ajouter des enregistrement sans obligatoirement l'indiquer (ou pourra penser à une reprise de contenu => tu as un fichier qui ne contient que les articles et quelques infos mais pas de fournisseur, plutot que les recréer à la main en indiquent le fournisseur à chaque fois, tu fais un import globale et ensuite tu pourras faire des modif pour l'indiquer).

c'est simplement une info, je pense qu'elle te sera utile, sinon ca mange pas de pain =p

naga
0
BasicInstinct Messages postés 1470 Date d'inscription mardi 5 février 2002 Statut Membre Dernière intervention 20 octobre 2014 12
12 sept. 2014 à 14:45
Effectivement, une FK peut tout a fait être nullable. Ça dépend toujours du besoin, et du sens des choses.
un exemple bidon :
un enfant a une maman, certains enfants sont orphelins (FK null pour eux). Généralement, je préfère modéliser un enregistrement "non maman", tout dépendant évidement du contexte.
Par contre utiliser une FK nullable pour insérer des données et les mettre à jour les relations a posteriori pour facilité le traitement est à mon sens une erreur.
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
12 sept. 2014 à 15:26
ca dépend des cas, comme toujours. Perso j'ai des fichier de plusieurs millions d'enregistrement et mes clef etrangères ne feraient que bloquer mon import et avoir des pertes de contenu ce qui n'est pas acceptable.

C'est toujours pareil, tout dépend de ce que tu fais, je donne l'astuce car ca peu être utile de le savoir.

j'ai aussi eu des cas, pour reprendre ton exemple, où les utilisateurs créés des maman "morte" puis "mouru" puis "non", etc etc ... donc dans les deux cas il y a avantage et inconvénient, c'est au dev de gérer et au cahier des charges d'être complet ;)
0
Rejoignez-nous