Comment gérer un grand nombre à plusieurs jointures dans sql pour html5and programmation css3

Les jointures internes sont un moyen idéal pour mettre en œuvre un à-plusieurs SQL pour la programmation HTML5 et CSS3. Si vous regardez les diagrammes ER, vous voyez souvent beaucoup à de nombreuses relations, aussi. Bien sûr, vous devez également les modéliser. Voici le secret: Vous ne pouvez pas vraiment le faire. Le modèle de données relationnelles ne pas vraiment une bonne façon de faire beaucoup à plusieurs jointures. , Vous truquer la place. Il est pas difficile, mais il est un peu sournoise.

Vous utilisez beaucoup à plusieurs jointures pour traiter les données cotées, telles que la relation entre le héros et le pouvoir. Chaque héros peut avoir un certain nombre de pouvoirs, et chaque puissance peut appartenir à un certain nombre de héros.

La jointure interne était facile parce que vous venez de mettre une référence clé étrangère à un côté de la relation dans la table n. Dans un grand nombre à plusieurs rejoindre, il n`y a pas « un » côté, alors où mettez-vous la référence? Laissez les informaticiens de trouver une solution sournoise.

Notez que ce tableau ne contient aucune référence aux pouvoirs. Vous voyez beaucoup de pouvoirs, mais aucune référence aux héros.

Voici la partie la plus délicate.

Les résultats de cette requête peut vous surprendre. La nouvelle table ne contient que des clés étrangères. Il ne fait pas beaucoup de sens lui-même, mais il représente l`une des idées les plus importantes dans les données.

Comprendre les tables de liens

le hero_power table est une table de marque nouvelle, et il est certes un petit canard bizarre:

  • Il ne contient aucune donnée de lui-même. Très peu apparaît dans la table.

  • Il est pas une entité. La plupart des tables sont sur les entités dans vos données. Celui-ci n`est pas.

  • Il est d`une relation. Ce tableau est en réalité sur les relations entre le héros et le pouvoir. Chaque entrée de ce tableau est un lien entre le héros et le pouvoir.

  • Il contient deux références clés étrangères. Chaque enregistrement de cette table relie une entrée dans la héros une table dans la Puissance table.

  • Il a beaucoup à une jointure avec chacune des deux autres tables. Ce tableau a beaucoup à une relation avec le héros table. Chaque enregistrement de hero_power se connecte à un enregistrement du héros. De même, chaque enregistrement de hero_power se connecte à une fiche de courant.

  • Les deux many-to-one rejoint créer un grand nombre à plusieurs rejoindre. Voici la partie magique: En créant une table avec deux many-to-one des jointures, vous créez un grand nombre à plusieurs jointure entre les tables originales!

  • Ce type de structure est appelée table de liens. tables de liaison sont utilisés pour créer de nombreux à plusieurs relations entre les entités.

Comment utiliser les tables de lien pour faire un grand nombre à plusieurs jointures

Voici un diagramme ER complet des données de héros.

Lier les tables ne sont pas vraiment utiles sur leur propre parce qu`ils ne contiennent pas de données réelles. En règle générale, vous utilisez une table de lien dans une requête ou une vue:

SELECThero.name AS `héros`, power.name AS « power`FROMhero, puissance, hero_powerWHEREhero.heroID = hero_power.heroIDANDpower.powerID = hero_power.powerID-

Voici quelques réflexions sur ce type de requête:

  • Il combine trois tables. Cette complexité semble effrayant au début, mais il est vraiment bien. Le point de cette requête est d`utiliser la hero_power table pour identifier les relations entre le héros et le pouvoir. Notez que le DE l`article énumère les trois tableaux.

  • le clause a deux liens. La première partie de la l`article lie la hero_power table avec la héros table avec une jointure interne. La deuxième partie relie la Puissance table avec une autre jointure interne.

  • Vous pouvez utiliser une autre clause pour limiter davantage les résultats. Bien sûr, vous pouvez toujours ajouter d`autres parties à la ET clause de rendre les résultats résoudre un problème particulier, mais laisser cela seul pour l`instant.

Maintenant, vous avez des résultats que vous pouvez utiliser.

Encore une fois, cette requête est un endroit évident pour une vue:

CREATE VIEW heroPowerView ASSELECThero.name AS `héros`, power.name AS « power`FROMhero, puissance, hero_powerWHEREhero.heroID = hero_power.heroIDANDpower.powerID = hero_power.powerID-

En règle générale, vous ne ferez pas vos résultats exactement comme ce point de vue. , Vous affichez au lieu d`information pour, par exemple, Boy Binary, et que vous voulez une liste de ses pouvoirs. Il ne faut pas dire Binary Boy trois fois, donc vous avez tendance à utiliser deux requêtes (à la fois d`une vue, si possible) pour simplifier la tâche. Par exemple, regardez ces deux requêtes:

SELECT * FROM heroMissionView héro = `binaire puissance boy`-SELECT FROM heroPowerView héro =` boy`- binaire

La combinaison de ces requêtes vous donne suffisamment de données pour décrire tout dans la table d`origine. En règle générale, vous attachez toutes ces données ensemble dans votre code PHP.

Le code d`accès standard est de données PHP, sauf qu`il fait deux passes à la base de données:

showDetails.php? Lt; php // connecttry {$ con = new PDO ( `mysql: host = localhost-dbname = haio`, "haio", "haio") - con-$ gt; setAttribute (AOP :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION) - // obtenir plus d`informations pour héros demandé $ héros = "garçon binaire"- $ query = lt; lt;
query ($) - les résultats $ gt; setFetchMode (AOP :: FETCH_ASSOC) -foreach ($ result que $ row) {foreach ($ row comme $ champ = gt; valeur $) {print lt; lt;
champ $
valeur $
ICI-} // end field foreach} // fin rangée foreachprint "
pouvoirs
n"-impression "
n"- // créer une autre requête pour saisir les pouvoirs $ query = lt; lt;query ($) -print "
    n"-foreach ($ result que $ row) {foreach ($ row comme $ champ = gt; valeur $) {print "
  • valeur $
  • n"-} // fin foreach} // end tout en loopprint "
n"-impression "
n"-impression "
n"-} catch (PDOException $ e) {echo `erreur:`. $ E-gt; getMessage () -} // fin essayer gt;?
Articles connexes