IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[Debutant] Quelles différences entre un JOIN LEFT et les relations lors de la modelisation d'un DB [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut [Debutant] Quelles différences entre un JOIN LEFT et les relations lors de la modelisation d'un DB
    Bonjour à tous,
    Je suis un peu perdu dans ma structure de base de donnée.

    Quelles différence y a t il entre une jointure et la modèlisation d'une base de donnée.

    J'ai cherché sur le net et j'ai trouvé deux bon tuto. Le premier parle des jointure. il montre un code PHP pour faire une jointure avec un WHERE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT tutoriels.id,titre,category_id,categories.name
    ORDER tutotiels,categorie
    WHERE category.id=categories.id
    ORDER BY tutoriels.id DESC
    Mais aussi il parle plus tard d'utiliser le LEFT JOIN, RIGHT JOIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT tutoriels.id,titre,category_id, categories.nom
    FROM tutoriels
    LEFT JOIN categories ON tutoriels.category_id=categories.id
    ORDER BY tutoriels.id DESC
    Le "coeur" de ma question..
    Dans un autre tuto, le monsieur eplique commen faire une relation lors de la modelisation d'une base de donnée

    Ma question, concrètement
    Mais alors qu'elle est la différence entre une liaison en code PHP (JOIN LEFT) et les liaison qui ont été faite dans la base de donnée ?

    J'espère vous avoir donner suffisamment de étail et d'avoir été clair :o)

    En tout cas, milles mercis a ceux qui pour allumer mes lanternes :o)
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    La différence entre JOIN et LEFT JOIN est très simple.

    Admettons une table "produits" qui contient 10 produits de 1 à 10, dont la clé primaire est "produit_id".
    Puis on a une autre table "promos" qui contient donc un ensemble de produits ("produit_id"), admettons 2 produits : produits_id 5 et 8.
    Cette table contient 2 autres champs : "debut" et "fin", 2 champs datetime pour désigner le début et la fin de la promotion.

    Si on fait cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *
    FROM produits JOIN promos ON produits.produit_id = promos.produit_id
    Seul 2 produits seront récupérés, ceux présents dans les 2 tables.
    Le JOIN est donc très restrictif, il faut que chaque tuples (ou ligne) défini dans le ON soient présent des 2 cotés, ici c'est le "produit_id", les 5 et 8.
    Concrètement, on ne récupère que les produits en promotions.

    Si on fait un LEFT JOIN à la place, tous les produits seront récupérés (sans exception vu qu'il n'y pas de condition dans la clause where), les 10 donc.
    Le LETF JOIN est donc moins restrictif, ici, il suffit que le produits, le "produit_id" soit présent dans la table "produits".
    Les valeurs des champs "debut" et "fin" non présents dans la table "promos" seront NULL.


    Il faut donc faire gaffe à ne pas utiliser n'importe quelle type de jointure, car on voit bien ici que certaine lignes peuvent soient passer à la trappe, ou alors en récupérer plus que prévues.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ta première syntaxe est ancienne, on utilise maintenant JOIN (dont RIGHT et LEFT JOIN sont des variantes).

    Mais alors qu'elle est la différence entre une liaison en code PHP (JOIN LEFT) et les liaison qui ont été faite dans la base de donnée ?
    PHP ne fait pas de jointures, il ne fait que transmettre la requête.

    Dans le cas le plus simple, dans la structure de la base, la jointure n'est qu'une vue de l'esprit : c'est à dire qu'il y a deux tables que tu rassembles par un champ commun au moment de la requête et c'est tout.

    Dans le cas complexe (table Innodb) tu peux définir dans mysql le lien entre les deux tables et mysql veille au grain sur le respect de cohérence des données de part et d'autre.

    De la lecture :
    http://sqlpro.developpez.com/cours/sqlaz/jointures/
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Salut,
    Merci pour vos réponses.
    En fait j'ai vu que j'ai manqué de donner des info...

    Mais es-ce que ceci est une jointure ou un indexage pour facilité la recherche. Par ce que si c'est une jointure (il parle de relation), comment interviendra ma requete "JOIN LEFT ... ON....?

    Milles merci

    Petit extra concernant MySQL Workbrench:
    On voit dans MySQL Workbrench qu'on peut créer des relation 1:n, 1:1, n:n
    Avez vous une idée des différence entre elle?
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  5. #5
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Mais es-ce que ceci est une jointure ou un indexage pour facilité la recherche. Par ce que si c'est une jointure (il parle de relation), comment interviendra ma requete "JOIN LEFT ... ON....?
    C'est ni l'un, ni l'autre, c'est une contrainte, c'est entre autre pour cela que l'on parle de SGBDR, et tantôt SGBD tout court (sans R).
    C'est d'ailleurs ce que évoque Sabotage, MySQL avec un moteur MyISAM n'est pas relationnel alors qu'InnoDB est relationnel.

    Faudrait que tu épluche les doc MySQL comme :
    CONSTRAINT : http://dev.mysql.com/doc/refman/5.0/...nstraints.html
    CREATE TABLE : http://dev.mysql.com/doc/refman/5.0/...ate-table.html
    ALTER TABLE : http://dev.mysql.com/doc/refman/5.0/fr/alter-table.html

    Avec les contraintes, on peu donc désigner et référencer que tel champ est une clé étrangère (fk -> FOREEIGN KEY) de telle table.

    Dans ton exemple, il faudrait avoir les codes SQL qui ont permis de créer cet index fk_article_has_categories_articles, c'est pas dit que ce soit une vrai contrainte.
    Mais ce n'est pas ça qui va déterminer s'il faut un JOIN ou LEFT JOIN, ça n'a aucun rapport.
    La différence entre LEFT JOIN ou un JOIN est totalement conditionnée par rapport à ce qu'on souhaite obtenir, et rien d'autre.


    Petit extra concernant MySQL Workbrench:
    On voit dans MySQL Workbrench qu'on peut créer des relation 1:n, 1:1, n:n
    voir ici, dans le cercle vert.
    Avez vous une idée des différence entre elle?
    Les 1:n, 1:1, n:n se sont les cardinalités, mais on dit plus souvent les relations, c'est pareil pour moi.
    Exemple :
    1,n : Pour 1 élément (clé primaire) d'une table A sera lié à 0 ou n éléments d'une table B
    1,1 : Pour 1 élément d'une table A sera lié à 1 et un seul élément de la table B
    Les 1,1 ou autre 1,n c'est la base même qui détermine comment on va créer sa Bdd (créations des tables).
    Ceci veut dire que les cardinalités devraient être connues avant même avoir créer une table.

    D'ailleurs, il y a des realtions dans absolument toutes les données de toutes les tables.
    Prenons pour exemple la table tb_calendrier, et des champs "fd_date" et "fd_season".
    Et bien ici il y a une relation entre elles, et elle est de : 1,1, et c'est pour cette raison quelles se trouvent dans la même table.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  6. #6
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Merci pour toutes vos réponses. Je vais étudier tout ceci!
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 67
    Dernier message: 16/12/2007, 13h41
  2. Réponses: 3
    Dernier message: 04/11/2007, 22h31
  3. Quelles différences entre TDBGrid et TJvDBGrid ?
    Par bds2006 dans le forum Delphi
    Réponses: 2
    Dernier message: 12/06/2006, 14h35
  4. [Type Sql] Quelles différences entre ces bases ?
    Par wonderboy dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 16/03/2006, 09h38
  5. Quelle différence entre "réel simple" et "déc
    Par pyxosledisciple dans le forum Access
    Réponses: 2
    Dernier message: 11/01/2006, 11h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo