Technik, Gothic und Anderes

Technik ist Spiel, Gothic ist ernst und Zeit hat man zuviel

  • Kategorien

  • Tags

  • Archiv

  • Links

    zu Bee5

    blog.oncode.info läuft bei Cyon und ich bin sehr glücklich damit.

m:n Beziehungen zu Lookup-Tables mit einem SQL-Befehl erstellen

Geschrieben von skaldrom am 11. November 2009

puzzleBei diesen Beitrag habe ich echt überlegt, ihn unter einem anderen Namen zu veröffentlichen. Ist der Inhalt doch eigentlich sowas von trivial und für Menschen mit mehr als zwei Hirnzellen wahrscheinlich sowieso offensichtlich. Aber das Gefühl, das mich durchflutet hat als mich Erkenntnis küsste war so erfüllend und erhebend, dass ich dieses gerne mit Euch teilen würde.

SQL ist eine geniale Erfindung. Zwar wird es im Moment arg von den schmächtigen noSQL bedrängt, aber es wird wie triumphieren *star-wars-musik-on*, denn die Anderen werden untergehen wie die noAngels, es wird gewinnen wie die Maden über die noMaden, häufiger verwendet werden, so wie es das Ah gegenüber noAh wird und edler sein, wie der Orden gegenüber noRden! Ich bin heute noch auf der Suche nach der vernünftigen Frage, die nicht in ein einziges SQL-Statement verpackt werden kann.*star-wars-musik-off*

Beispiel-Schema

Doch zurück zum Problem: Es seien Entitäten gegeben, die m:n Beziehungen zu “lookup-Werten” haben. Ein bestehender Wert in einem Set also, das sich selten ändert wie beispielsweise Kategorien, Zustände, Farben, Ländercodes, Geschlechter oder so etwas. Ein weiterer Use Case wäre ein Import, bei dem die Datensätze schon erstellt wurden und nun nur noch die Verbindungen fehlen.

Hier ein Beispiel:
Personen beinhalten, ja ratet mal, Personen.Hier vereinfacht nur mit Namen und Vornamen.
Personentypen bezeichnen die Art der Person. Beispielsweise Lernender, Lehrperson, Verwaltungsangestellter oder auch Schulleiter.

Jede Person kann mehreren Personentypen entsprechen. Diagnose: klassisches m:n mit Verbindungstabelle (personen_personentypen).

ERD-Diagramm einer m:n Beziehung

Die Inhalte der Tabellen gestalten sich folgendermassen:

Personen

+----+---------------+-----------+
| id | name          | vorname   |
+----+---------------+-----------+
|  1 | Schinkler     | Sebastian |
|  2 | Moser         | Hanspeter |
|  3 | Gublinsbacher | Anneli    |
|  4 | Iltis         | Mahara    |
+----+---------------+-----------+

Personentypen

+----+-------------------------+
| id | personentyp             |
+----+-------------------------+
|  1 | Lernender               |
|  2 | Lehrperson              |
|  3 | Verwaltungsangestellter |
|  4 | Schulleiter             |
+----+-------------------------+

Insert kombiniert mit Select

Der alte Ablauf war folgendermassen:

  1. Lese ID von Personen.
  2. Lese ID von Personentypen.
  3. Füge einen neuen Verbindungsdatensatz in personen_personentypen ein.

Doch es geht viel einfacher! Die Werte, die in personen_personentypen eingefügt werden sollen, können direkt im Statement selektiert werden. Grundsätzlich fügt man also das Resultat einer Abfrage ein:

INSERT INTO personen_personentypen
  SELECT p.id, pt.id FROM personen p, personentypen pt
    WHERE p.name='Moser' AND p.vorname='Hanspeter' AND pt.personentyp='Lehrperson'

Wirklich effizient wird es, wenn man gerade mehrere Lookupwerte verbindet:

INSERT INTO personen_personentypen
  SELECT p.id, pt.id FROM personen p, personentypen pt
    WHERE p.name='Gublinsbacher' AND p.vorname='Anneli' AND pt.personentyp IN('Verwaltungsangestellter', 'Schulleiter')

Jaaa, mit so einfachen Dingen kann man mich glücklich und zufrieden machen…

Teile und geniesse:
  • Technorati
  • del.icio.us
  • MisterWong
  • Digg
  • StumbleUpon
  • Facebook
  • Google Bookmarks
  • Netvibes
  • Reddit
  • Twitter
  • Print
  • email
  • LinkArena


Eine Antwort zu “m:n Beziehungen zu Lookup-Tables mit einem SQL-Befehl erstellen”

Trackbacks


  1. Left join mit MySQL | root1024:~$

    [...] können die Daten mit PHP weiterverarbeitet werden. Dies war nun eine n:1 Beziehung. Hier habe ich einen Beitrag gefunden, wie eine m:n Beziehung aufgelöst werden kann. KategorienMySQL [...]

  2. Lassen Sie eine Antwort hier...

    XHTML: Sie können folgende Tags verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>