Entwerfen von Beziehungen um eine Vererbungsstruktur
Ich habe eine konzeptionelle Frage, wie ich meine Datenbank am besten organisieren kann.
erzeit habe ich vier Kerntabellusers
, teachers
, students
undnotifications
. Sowohl dasteachers
undstudents
-Tabellen erben vonusers
Tabelle enthält also den Fremdschlüsseluser_id
.
Dasnotifications
table bezieht sich, wie Sie vielleicht erraten haben, auf Benachrichtigungen. Diese müssen für alle Benutzer angezeigt werden, die zu einer Mitarbeitergruppe gehören, d. H. Unter der Beschäftigung eines anderen.
Beide Schüler und Lehrer können andere Benutzer beschäftigen.
So der springende Punkt ist, ich brauche eine beredte Art, dies zu modellieren. Der grundlegende Arbeitsablauf des Codes wäre der folgende:
getCurrentUser->getAllEmployer(s)->getNotifications
Dies ist der Laravel Eloquent, an den ich gewöhnt bin$user->employers()->notifications;
Leider ist es nicht so einfach, wie in diesem Fall ein Arbeitgeber auf zwei Tabellen verweisen kann.
So sind meine Wahlen wie folgt.
Erstelle eine eloquente Beziehung für diestudent
undteacher
Beziehung als Arbeitgeber. Das Manko ist, dass ich schreiben muss, wenn Tests prüfen, ob der aktuelle Benutzer zu einem von beiden gehört und dieser Code häufig wiederholt wird.Füge hinzu einteacher_id
undstudent_id
zumusers
Tabelle. Man würde jedoch offensichtlich in jedem Datensatz überflüssig sein. Die Möglichkeit, weitere Spalten hinzufügen zu müssen, ist ebenfalls sehr wahrscheinlich, da neue Arbeitgeberunternehmen entstehen.Erstelle einemployer_employee
-Tabelle mit zwei Spalten, die beide auf ein @ verweisuser_id
. Eine SQL-Abfrage würde LEFT JOIN beidestudent
undteacher
Tabellen mit dememployer_employee
table und dann ein JOIN mitnotifications
würde alle relevanten zurückgeben. Allerdings würden so viele Verknüpfungen die Geschwindigkeit der Abfrage im Vergleich zu den anderen Optionen verringern.Etwas, an das ich nicht gedacht habe.Ich bin wirklich auf der Suche nach dem effizientesten, skalierbar Lösung.
Jede Hilfe wird gebeten. Wenn Sie klären könnten, warum Ihre Antwort auch die effizienteste skalierbare Lösung ist, wäre das großartig.