Guten Morgen.
Also, zum Szenario "Expedition kann mehr als einen Leiter haben" ist wie gesagt eine klassische "m:n"-Beziehung. Allein um jetzt bei dir dieses Szenario zu implementieren wüsste ich zwei Vorgehensweisen.
Beide Varianten haben gemeinsam, dass es in Tabelle "Expedition" KEIN Feld "LID" bzw. pID" gibt, welches direkt auf einen Personensatz zeigt!!!!!
Variante 1)
In Tabelle "Teilnehmer" fügst du eine zusätzliche Spalte ein (Bsp. "Leiter"). Für diese Spalte benutzt du einen INTEGER-Datentyp (SmallINT, TinyInt, was auch immer) mit DEFAULT=0.
Die "0" bezeichnet einen Teilnehmer als normalen Teilnehmer, alles grösser 0 ist ein Leiter.
Ob du jetzt pauschal sagst, Leiter=1 ist ein Leiter, oder ob du eine Leiter-Hierarchie haben willst, ist dir überlassen.
Bsp. Zvoni hat Leiter=0, Fritz Müller hat Leiter=1, Hans Wurst hat Leiter=2
würde hier bedeuten:
Zvoni ist normaler Teilenehmer
Fritz Müller ist ein Leiter
Hans Wurst ist der Hauptleiter (weil er den höchsten Wert hat)
Eine Abfrage wie "Zeige mir für Expedition eID=17 alle Teilnehmer an, Die Leiter sollen als erstes hierarchisch ausgewiesen werden" könnte so aussehen:
SQL:
SELECT
personen.vorname, personen.nachname
FROM
expedition, personen, teilnehmer
WHERE
teilnehmer.eid=expedition.eid AND
personen.pid=teilnehmer.pid AND
expedition.eid=17
ORDER BY
teilnehmer.Leiter DESC,
personen.nachname,
personen.vorname
Eine Abfrage "Zeige mir die Leiter für Expedtion eID=17" könnte so aussehen (Die Abfrage ist diesselbe wie oben drüber zzgl. des zusätzlichen Filters.
SQL:
SELECT
personen.vorname, personen.nachname
FROM
expedition, personen, teilnehmer
WHERE
teilnehmer.eid=expedition.eid AND
personen.pid=teilnehmer.pid AND
expedition.eid=17 AND
teilnehmer.leiter>0
Variante 2)
Hinweis: Diese Variante nenne ich nur der Vollständigkeit halber!
Eine Zusätzliche Tabelle "Leiter" (Da haben wir die Tabelle wieder) mit folgenden Feldern:
eID --> Zeiger auf die Expedition
pID --> Zeiger auf die Person, welche Leiter ist
In dieser Variante brauchst du in Tabelle "Teilnehmer" KEINE zusätzliche Spalte (wie oben)
In dieser Konfiguration hast du aber wieder das Thema: Steht hier eine pID drin, ist es "ein" Leiter --> Keine Hierarchie! Willst du in dieser Variante eine Hierarchie haben, brauchst du auch hier eine zusätzliche Spalte "Hauptleiter" (oder ähnlich). Wieder mit Datentyp INTEGER.
Ob du hier die "0" als Hauptleiter machst, und alle mit einer "1" Nebenleiter sind, ist dir überlassen.
Die Abfragen sind aber um einiges komplizierter (Hier würde es dann losgehen mit UNION SELECT usw.)
Ich empfehle in deinem Fall eh Variante 1, weil man sich eine Tabelle sparen kann.
Desweiteren kannst du in die Situation kommen, dass z.B. Fritz Müller in Expedition 5 ein normaler Teilnehmer war, in Expedition 8 ist er ein Leiter, in Expedition 17 ist er Hauptleiter.
Ist mit Variante 1 deutlich einfacher zu handhaben.