Bonjour,
je suis actuellement en train de coder un site décrivant les données techniques d'un ensemble de produits et j'aimerai organiser correctement ma base de donnée.
Dans un premier temps, j'ai utilisé une table unique pour tester les requêtes :
A un produit on lui associe une liste d'éléments simples (nom, présentation, fiche technique, schéma...) à champ unique. Si l'élément est présent dans la table, on l'affiche dans un onglet, sinon il est masqué.
Désormais je désire permettre à un produit de posséder plusieurs fiches techniques, schémas, ... J'ai donc décidé de modifier ma base de donnée (ça revient à transformer la relation 0-1 à 0-n).
Plusieurs problématiques, pour la suite on considérera un lien PDF contenue dans la table Fiche_Technique pour l'exemple. Elle contient donc deux champs : le nom et l'url.
1. Sachant qu'un produit a entre 0 et N liens PDF et qu'un lien PDF est associé à un et un seul produit, quelle méthode considérer ?
- créer une table de jointure (nommons là P_FT pour Produit/Fiche_technique) contenant une clef primaire composée de deux éléments : foreign_P et foreign_FT (égaux aux ID des tables respectives).
- rajouter un champ dans chaque élément (Fiche_technique ici) nommé foreign_P, égal au seul ID du produit contenant ce lien PDF.
http://i.imgur.com/AihBB0g.png
Ci-dessus sur l'image, à gauche une table de jointure, à droite l'ajout d'un champ dans Fiche_technique. Je n'ai pas affiché les relations qui sont citées plus haut :
-> Un produit contient 0..n fiches techniques
-> Une fiche technique appartient à 1..1 produit
2. Au niveau de la manière d'écrire correctement les requêtes SQL j'ai cru comprendre qu'il était préférable d'utiliser INNER JOIN plutôt que WHERE lorsqu'il s'agit de jointures, c'est bien cela ? Contrairement à l'image les champs foreign_P et foreign_FT définissant la Primary Key de la table de jointure doivent être de type "INT" tout simplement et non "Auto_increment" ?
Ensuite, pour renommer une table j'écrivais d'habitude "FROM Table1 AS t1,Table2 AS t2" : l'écriture "FROM Table1 t1, Table2 t2" fonctionne aussi ? Laquelle est la plus "propre" d'utilisation ?
L'utilisateur doit pouvoir modifier la BDD en rajoutant des fiches techniques à un produit : dans le cas de la table de jointure la requête INSERT INTO semble plus compliquée puisque l'on doit modifier deux tables (Fiche_Technique et PFT) au lieu d'une (Fiche_Technique).
Au niveau de l'insert de donnée on aurait ça ? Quelles possibilités perdons-nous en n'utilisant pas de table de jointure ?
$id_P étant une variable PHP contenant l'ID (ou le nom) du produit en question.
Au niveau de la requête cela donnerait donc ceci ?
Édition : ce modèle logique de données relationnel est-il valide pour gérer un ensemble de produits possédant chacun des caractéristiques différentes ?
http://i.imgur.com/dfBYx4G.png
Modifié par Ara (09 Jul 2015 - 14:00)
je suis actuellement en train de coder un site décrivant les données techniques d'un ensemble de produits et j'aimerai organiser correctement ma base de donnée.
Dans un premier temps, j'ai utilisé une table unique pour tester les requêtes :
A un produit on lui associe une liste d'éléments simples (nom, présentation, fiche technique, schéma...) à champ unique. Si l'élément est présent dans la table, on l'affiche dans un onglet, sinon il est masqué.
Désormais je désire permettre à un produit de posséder plusieurs fiches techniques, schémas, ... J'ai donc décidé de modifier ma base de donnée (ça revient à transformer la relation 0-1 à 0-n).
Plusieurs problématiques, pour la suite on considérera un lien PDF contenue dans la table Fiche_Technique pour l'exemple. Elle contient donc deux champs : le nom et l'url.
1. Sachant qu'un produit a entre 0 et N liens PDF et qu'un lien PDF est associé à un et un seul produit, quelle méthode considérer ?
- créer une table de jointure (nommons là P_FT pour Produit/Fiche_technique) contenant une clef primaire composée de deux éléments : foreign_P et foreign_FT (égaux aux ID des tables respectives).
- rajouter un champ dans chaque élément (Fiche_technique ici) nommé foreign_P, égal au seul ID du produit contenant ce lien PDF.
http://i.imgur.com/AihBB0g.png
Ci-dessus sur l'image, à gauche une table de jointure, à droite l'ajout d'un champ dans Fiche_technique. Je n'ai pas affiché les relations qui sont citées plus haut :
-> Un produit contient 0..n fiches techniques
-> Une fiche technique appartient à 1..1 produit
2. Au niveau de la manière d'écrire correctement les requêtes SQL j'ai cru comprendre qu'il était préférable d'utiliser INNER JOIN plutôt que WHERE lorsqu'il s'agit de jointures, c'est bien cela ? Contrairement à l'image les champs foreign_P et foreign_FT définissant la Primary Key de la table de jointure doivent être de type "INT" tout simplement et non "Auto_increment" ?
Ensuite, pour renommer une table j'écrivais d'habitude "FROM Table1 AS t1,Table2 AS t2" : l'écriture "FROM Table1 t1, Table2 t2" fonctionne aussi ? Laquelle est la plus "propre" d'utilisation ?
L'utilisateur doit pouvoir modifier la BDD en rajoutant des fiches techniques à un produit : dans le cas de la table de jointure la requête INSERT INTO semble plus compliquée puisque l'on doit modifier deux tables (Fiche_Technique et PFT) au lieu d'une (Fiche_Technique).
Au niveau de l'insert de donnée on aurait ça ? Quelles possibilités perdons-nous en n'utilisant pas de table de jointure ?
INSERT INTO Fiche_technique (nom,url,foreign_P)
VALUES ('texte à afficher','url du PDF',$id_P);
$id_P étant une variable PHP contenant l'ID (ou le nom) du produit en question.
Au niveau de la requête cela donnerait donc ceci ?
SELECT FT.nom, FT.url
FROM Fiche_technique FT
INNER JOIN Produit P
ON id_P = foreign_P;
Édition : ce modèle logique de données relationnel est-il valide pour gérer un ensemble de produits possédant chacun des caractéristiques différentes ?
http://i.imgur.com/dfBYx4G.png
Modifié par Ara (09 Jul 2015 - 14:00)