Wie Verwalten von Many-to-Many Joins in SQL für HTML5and CSS3 Programmierung

Innere Verknüpfungen sind eine perfekte Weise, eins-zu-viele SQL-Beziehungen für HTML5 und CSS3 Programmierung zu implementieren. Wenn Sie bei ER-Diagramme betrachten, sehen Sie oft viele-zu-viele-Beziehungen, auch. Natürlich müssen Sie auch, sie zu modellieren. Hier ist das Geheimnis: Sie können nicht wirklich tun. Das relationale Datenmodell hat nicht wirklich eine gute Art und Weise verbindet viele-zu-viele zu tun. Stattdessen Sie fälschen. Es ist nicht schwer, aber es ist ein bisschen hinterhältig.

Sie verwenden viele-zu-viele schließt sich aufgelisteten Daten, wie die Beziehung zwischen Held und Macht zu handhaben. Jeder Held kann eine beliebige Anzahl von Befugnissen haben, und jede Leistung kann auf eine beliebige Anzahl von Helden gehören.

bild0.jpg

Die innere join war einfach, weil Sie nur einen Fremdschlüssel Bezug auf die eine Seite der Beziehung in der viele Tisch. In einer many-to-many verbinden, gibt es keinen # 147-one # 148- Seite, also wo setzen Sie die Referenz? Lassen Sie es zu Informatiker mit einer hinterhältigen Lösung zu kommen.

Beachten Sie, dass diese Tabelle auf Potenzen keinen Hinweis enthält. Sie sehen eine Menge von Befugnissen, aber keinen Hinweis auf Helden.

image1.jpg

Hier ist der schwierige Teil.

image2.jpg

Die Ergebnisse dieser Abfrage können Sie sich überraschen. Die neue Tabelle enthält nichts anderes als Fremdschlüssel. Es macht nicht viel Sinn, auf seiner eigenen zu machen, aber es ist eine der wichtigsten Ideen in Daten.

Das Verständnis Link-Tabellen

Das hero_power Tabelle ist eine brandneue Tisch, und es ist zugegebenermaßen eine ungerade kleine Ente:

  • Es enthält keine eigenen Daten. Sehr wenig erscheint in der Tabelle.

  • Es geht nicht um eine Einheit. Die meisten Tische sind über Entitäten in Ihren Daten. Dieser ist nicht.

  • Es geht um eine Beziehung. Diese Tabelle ist eigentlich über die Beziehungen zwischen Held und Macht. Jeder Eintrag dieser Tabelle ist eine Verbindung zwischen Held und Macht.

  • Es enthält zwei Fremdschlüssel-Referenzen. Jeder Datensatz in dieser Tabelle verknüpft einen Eintrag in der Held Tisch mit einem in der Power Tabelle.

  • Es hat eine viele-zu-eins mit jedem der beiden anderen Tabellen verbinden. Diese Tabelle hat eine Viele-zu-eins-Beziehung mit dem Held Tabelle. Jeder Datensatz von hero_power eine Verbindung zu einem Datensatz von Helden. Ebenso jeder Datensatz von hero_power eine Verbindung zu einem Datensatz der Macht.

  • Die beiden viele-zu-eins reiht sich in eine many-to-many erstellen beizutreten. Hier ist der magische Teil: Durch eine Tabelle mit zwei viele-zu-eins zu schaffen Joins erstellen Sie eine many-to-many-Verbindung zwischen den ursprünglichen Tabellen!

  • Diese Art von Struktur wird als ein Verknüpfungstabelle. Link-Tabellen werden verwendet, um viele-zu-viele Beziehungen zwischen Objekten erstellen.

Wie man Link-Tabellen verwenden, um viele-zu-viele-Joins

Hier ist eine ausgewachsene ER-Diagramm der Held Daten.

image3.jpg

Link-Tabellen sind nicht wirklich nützlich für ihre eigenen, weil sie keine tatsächlichen Daten enthalten. Im Allgemeinen verwenden Sie einen Link-Tabelle in einer Abfrage oder Ansicht:

SELECThero.name AS 'Held', power.name AS 'power'FROMhero, Macht, hero_powerWHEREhero.heroID = hero_power.heroIDANDpower.powerID = hero_power.powerID-

Hier sind einige Gedanken über diese Art der Abfrage:

  • Es kombiniert drei Tabellen. Diese Komplexität scheint auf den ersten beängstigend, aber es ist wirklich in Ordnung. Der Sinn dieser Abfrage ist die zu verwenden hero_power Tabellenbeziehungen zwischen Held und Macht zu identifizieren. Beachten Sie, dass die VON Klausel listet alle drei Tabellen.

  • Das WOHER Klausel hat zwei Links. Der erste Teil der WOHER Klausel anknüpft die hero_power Tabelle mit den Held Tisch mit einem inneren verbinden. Der zweite Teil verbindet sich die Power Tisch mit einem anderen inneren verbinden.

  • Sie können eine andere Klausel verwenden, um die Ergebnisse weiter einzuschränken. Natürlich können Sie noch andere Teile der hinzufügen UND Klausel Gebrauch zu machen die Ergebnisse ein bestimmtes Problem zu lösen, aber das ist für jetzt in Ruhe lassen.

Jetzt haben Sie Ergebnisse, die Sie verwenden können.

image4.jpg

Wieder einmal diese Abfrage ist eine offensichtliche Ort für einen Blick:

CREATE VIEW heroPowerView ASSELECThero.name AS 'Held', power.name AS 'power'FROMhero, Macht, hero_powerWHEREhero.heroID = hero_power.heroIDANDpower.powerID = hero_power.powerID-

Typischerweise werden Sie Ihre Ergebnisse genau wie dieser Ansicht nicht. Stattdessen zeigen Sie Informationen für, sagen wir, Binary Boy, und Sie wollen eine Liste seiner Kräfte. Es ist nicht notwendig Binary Boy dreimal zu sagen, so neigen Sie dazu, zwei Abfragen zu verwenden (beide Ansichten, wenn möglich) die Aufgabe zu vereinfachen. Zum Beispiel, schauen Sie sich diese zwei Abfragen:

SELECT * FROM heroMissionView WHERE Held = 'binäre boy'-SELECT Strom aus heroPowerView WHERE Held =' binäre boy'-

Die Kombination dieser Abfragen gibt Ihnen genügend Daten alles in der ursprünglichen Tabelle zu beschreiben. Normalerweise legen Sie diese Daten alle zusammen in der PHP-Code.

Der Code ist Standard-PHP-Datenzugriff, außer es zwei Durchgänge in die Datenbank macht:

showDetails.php? Lt; php // connecttry {$ con = new PDO ( 'mysql: host = localhost-dbname = Haio "," Haio "," Haio ") - $ Ver-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION ) - // meisten Informationen für die angeforderte Held $ Held = "binary boy" erhalten - $ query = lt; lt;
query ($ query) - $ result-> setFetchMode (PDO :: FETCH_ASSOC) -foreach (als $ row führen $) {foreach ($ row als $ Feld => $ value) {print lt; lt;
$ Feld
$ value
Hier-} // end Feld foreach} // end Reihe foreachprint "
Befugnisse
N "-print"
N "- // erstellen Sie eine andere Abfrage, um die Kräfte $ query zu greifen = lt; lt;query ($ query) -Druck "
    N "-foreach ($ result als $ row) {foreach ($ row als $ Feld => $ value) {print"
  • $ value
  • N "-} // end foreach} // end während loopprint"
N "-print"
N "-print"
N "-} catch (PDOException $ e) {echo" ERROR: '. $ E-> getMessage () -} // Ende versuchen>?

Menü