King Lully: "n:m"

Beitrag lesen

Ich möchte in MySQL zwei Tabellen mittels einer n:m Beziehung verknüpfen. Also drei Tabellen. Ich weiß, dass geht mit dem JOIN-Befehl.

Nein, das geht nicht mit dem JOIN, JOIN ist für Abfragen vorgesehen, die bspw. gegen (oder "an" ;) die drei Tabellen (Tabelle "A", "Tabelle B", "Tabelle AB") gerichtet sind.

Wenn Du zum Beispiel Menschen und pol. Parteien hast, dann können Menschen in n Parteien Mitglied sein (zumindest theor. ;) und Parteien haben m Mitglieder, dann macht man folgendes i.p. Daten-Design:

Menschen:
Menschen_ID,
Menschen_Vorname,
Menschen_Nachname,
Menschen_Geburtsdatum          -- etc.
Parteien:
Parteien_ID,
Parteien_Name                  -- etc.
Menschen_Parteien:
Menschen_Parteien_ID,
Menschen_Parteien_Menschen_ID,
Menschen_Parteien_Parteien_ID
(bewährte Namensgebung aus dem Hause "King Lully" ;)
(Es geht da einerseits um eine regelnutzende Namengabe und DB-weit eindeutige Datenfeldnamen, auch wenns im ersten Moment bekloppt aussieht.)

UND richtet für "Menschen_Parteien_Menschen_ID" und "Menschen_Parteien_Parteien_ID" Fremdschlüssel ein (ggf. auch einen eindeutigen Index auf beide o.g. Datenfelder).

Erst dann kann von einer implementierten Beziehung die Rede sein.

Aber wie? Nach langwierigem Suchen habe ich folgendes gefunden:

TabelleA
TabelleB -> Beziehungstabelle
TabelleC

SELECT TabelleA.id, TabelleA.SpalteA
FROM TabelleA
JOIN TabelleB ON TabelleB.Aid = TabelleA.id
JOIN TabelleC ON TabelleC.id = TabelleB.Cid
WHERE TabelleC.wert = 'A';

Weder Namensgebung noch Darstellung der SQL-Query überzeugen, was wäre dagegen von:

  
SELECT  
 Menschen.Menschen_ID,  
 Menschen.Menschen_Vorname,  
 Menschen.Menschen_Nachname  
FROM  
 Menschen  
JOIN  
 Menschen_Parteien ON (Menschen_Parteien_Menschen_ID = Menschen_ID)  
JOIN  
 Parteien ON (Parteien.ID = Menschen_Parteien_Parteien_ID)  
WHERE  
 (Parteien_Name = 'CSU')  

Wundervoll, oder? Und wie intuitiv!

Aber irgenwie kommt mir das schon sehr lange vor. Funtionieren tut es, aber ist es auch effizient? Gibt es da nicht eine einfachere Methode?

Oracle kann die "n:m" angeblich automatisiert verwalten, ist ja eigentlich eher ein anderes DB-Objekt als eine Tabelle, erinnert mich an einen Index (na gut, bei King Lully bekommen die "n:m"-Tabellen immer eine ID ;).