Frage

Ich habe einige Tabellen, die von vielen zu vielen Tischen profitieren. Zum Beispiel das Team Tabelle.

Teammitglied kann mehr als eine ‚Position‘ hält im Team, alle Positionen sind in der Position db Tabelle aufgeführt. Die bisherigen Positionen gehalten werden auch für diese gespeicherte Ich habe eine separate Tabelle, so habe ich

  • Mitgliedertabelle (mit Team Details)
  • Positionen Tabelle (die Positionen)
  • member_to_positions Tabelle (id von Mitglieds- und ID der Position)
  • member_to_previous_positions (id von Mitglieds- und ID der Position)

Einfach, aber kommt der springende Punkt jetzt, dass ein Teammitglied gehören können viele Teams aghhh. Ich habe bereits eine team_to_member Look-Up-Tabelle. Jetzt kommt das Problem wie binde ich eine Position zu einem Team? Ein Mitglied kann auf ein Team gewesen Teamleiter haben, und ist derzeit Team Funker und Pressesprecher auf einem anderen Team. Wie ziehe ich nur auf das Info pro Mitglied seine aktuelle Position zu zeigen, sondern auch seine Vergangenheit einschließlich frühere Teams. Brauche ich einen position_to Team Tisch und irgendwie Querverweis hinzufügen, dass, oder kann ich das Team auf das Profil von Positionen Tabelle hinzufügen?

Es ist alles sehr verwirrend, diese Normalisierung.

War es hilfreich?

Lösung

Es ist vollkommen legitim, einen TeamPositionMember Tisch zu haben, mit den Spalten

Team_Id
Position_Code
Member_Id
Start_Date
End_Date NULLABLE

Und und eine Surrogat-ID-Spalte für Primärschlüssel, wenn Sie wollen; ansonsten ist es ein 3-Feld-Verbundprimärschlüssel. (Sie werden auf jeden Fall eine Einzigartigkeit Einschränkung für diese wollen.)

Mit dieser Anordnung können Sie ein Team mit jedem Satz von Positionen haben. Ein Team kann null oder mehr Personen pro Position hat. Eine Person kann füllen null oder mehr Positionen für null oder mehr Teams.

EDIT:

Wenn Sie Daten wollen, nur revidieren, wie oben gezeigt, und fügen Sie start_date an die PK der gleiche Person zu ermöglichen, die gleiche Position zu unterschiedlichen Zeiten zu halten.

Andere Tipps

Ja, eine many-to-many-Verknüpfungstabelle kann zusätzliche Attribute (Spalten) hat.

Zum Beispiel, wenn es eine Tabelle PassengerFlight Tabelle genannt, die von PassengerID und FlightID verkeilt ist, könnte es eine dritte Spalte sein, den Status des jeweiligen Passagiers auf dem gegebenen Flug zeigt. Zwei verschiedene Zustände werden könnten „bestätigt“ und „warten aufgelistet“, jeder von ihnen codierten irgendwie.

Darüber hinaus kann es ternäre Beziehungen sein, Beziehungen, die drei Einheiten umfassen und nicht nur zwei. Diese Tabellen werden drei Fremdschlüssel haben, die zusammengenommen die Primärschlüssel für die Beziehungstabelle.

Mein erster Gedanke:

Geben Sie Ihre many-to-many-Teams / Mitglieder-Tabelle eine ID-Spalte. Jedes Team-to-Mitglied Beziehung hat jetzt eine ID.

Erstellen Sie dann eine many-to-many Verknüpfung Positionen zu Teammitglied Beziehungen.

Auf diese Weise können die Teams mehrere Mitglieder haben, die Mitglieder mehrere Teams haben kann, und Mitglieder können pro Team auf einer Basis mehrere Positionen haben.

Jetzt ist alles schön und trocken, und die alle Verknüpfung scheint bis zu arbeiten. Klingt das Recht auf jemand anderes?

Klingt wie Sie eine many-to-many Positionen Teams Tabelle müssen jetzt.

Ihre team_to_member Tabelle kann in der Tat eine zusätzliche Spalte position_id müssen (oder in diesem Fall Punkt) beschreiben die Position der Mitglied in diesem Team hat.

Lassen Sie sich von member_to_previous_position Tabelle befreien. Verwenden Sie einfach member_to_positions und haben diese Spalten:

MemberToPositionID (autoincrement OK only)
MemberID
PositionID
StartDate
EndDate

Dann aktuellen Positionen zu finden, die Sie tun können:

select * 
from member_to_positions 
where EndDate is null
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top