Wie man eine foreign key verweist auf zwei Primärschlüssel?
Ich versuche zur Vereinfachung der Struktur einer Datenbank, und ich habe zwei Tabellen matches
und team_statistics
:
Hier in der team_statistics
Tabelle der team_statistics.team_id
sollte ein Fremdschlüssel, Referenzen matches.teams_id
und matches.teams_id1
und ähnlich team_statistics.group_id
sollte eine foreign key-Referenzierung matches.groups_id
und matches.groups_id1
Wie dies in PostgreSQL?
Wenn es andere Möglichkeiten gibt, dies zu tun, indem er eine weitere Tabelle zwischen matches
und team_statistics
ich bin offen für den Vorschlag, aber ich würde noch gerne wissen, wie man eine foreign key-Referenzierung zwei primäre Tasten.
- alle Werte
team_statistics.team_id
untermatches.team_id
undmatches.team_id1
- Recht?.. - jede Zeile in
team_statistics
werden sollte, für ein team, wennteam_statistics.team_id
ist in der Spiele-Tabelle, dann, wie würden Sie sagen, dass eine gewisse statistische gehört zu einer bestimmten Gruppe, die anderen team_id werden müsste null, und insgesamt, dass tut nicht wirklich fit in der Tabelle sehr gut - bitte, Lesen Sie meine Antwort und geben Sie Beispieldaten, wie es in Ihrer Frage
Du musst angemeldet sein, um einen Kommentar abzugeben.
Regeln für die FK-constraints
Antwort auf die Frage im Titel und am Ende des Textes:
"Ich würde noch gerne wissen, wie man eine foreign key-Referenzierung zwei primäre Schlüssel."
Das ist unmöglich.
Einen
FOREIGN KEY
Einschränkung können nur Punkt-zu - eine Tabelle, und jede Tabelle kann nur einePRIMARY KEY
Einschränkung.Oder Sie können mehrere
FOREIGN KEY
Einschränkungen auf der gleichen Spalte(N) verweisen auf einePRIMARY KEY
einer (anderen) Tabelle jeder. (Nur selten sinnvoll.)Jedoch, eine einzelne PK oder FK kann über mehrere Spalten erstrecken.
Und ein FK kann auf eine explizit definierte unique (set) Spalte(s) im Ziel, nicht nur die PK. Das Handbuch:
Einem mehrspaltigen PK oder
EINZIGARTIGE
Einschränkung kann nur verwiesen werden, die von einem mehrspaltigen FK-constraint mit einer passenden Spaltentypen., Was Sie Fragen
Da es ist nicht erlaubt die Verwendung der gleichen Spalte mehr als einmal in der Spaltenliste eines
UNIQUE
oderPRIMARY KEY
Einschränkung der target-Liste desFOREIGN KEY
kann auch nicht mit der gleichen Spalte mehr als einmal. Aber es gibt nichts, um uns von der Nutzung der gleichen Spalte mehr als einmal in der Quelle Liste. Hierin liegt das Potenzial, das umzusetzen, was Sie Fragen (aber wahrscheinlich nicht meinst):"In der
team_statistics
Tabelle derteam_statistics.team_id
sollte ein Fremdschlüssel, Referenzenmatches.team_id
undmatches.team_id1
"Die Kombination von
(team_id, team_id1)
in Tabellematches
hätte definiert werden müssenUNIQUE
. Werte inteam_statistics.team_id
würde auf Fälle beschränkt werden, mitteam = team1
in Tabellematches
als logische Konsequenz:Könnte sogar Sinn machen, für bestimmte setups, aber nicht deins.
, Was Sie wahrscheinlich benötigen,
Meine Vermutung ist, Sie wollen so etwas wie dieses:
(match_id, team_id)
in Tabelleteam_statistics
sollte ein Fremdschlüssel, Referenzen entweder(match_id, team_id)
oder(match_id, team_id1)
in Tabellematches
.... Und das ist nicht möglich, mit FK-constraints und nur zwei Tabellen. Sie könnte Missbrauch einer
CHECK
Einschränkung mit einem gefälschtenIMMUTABLE
- Funktion und machen esNOT VALID
. Siehe Kapitel "Günstiger mit einer CHECK-Einschränkung" in dieser Antwort:Aber das ist fortgeschrittene Tricks und weniger zuverlässig. Nicht mein Vorschlag hier, also ich werde nicht zu erarbeiten. Ich schlage vor, normalisieren Ihr schema in einer nützlichen Art und Weise, wie:
home
markiert die Heimmannschaft das match aber, durch die Aufnahme in die PK, schränkt auch zu max zwei teams pro Spiel. (PK Spalten definiert sindNOT NULL
implizit.)Den optionalen
UNIQUE
Einschränkung auf(team_id, match_id)
verhindert, dass teams aus den spielen gegen sich selbst. Durch die Verwendung der umgekehrten Reihenfolge der index-Spalten (irrelevant für die Durchsetzung der Regel) dies stellt auch ein index ergänzen die PK, die in der Regel auch nützlich. Siehe:Du könnte, eine separate
match_team_statistics
, aber das wäre nur eine optionale 1:1 Verlängerungmatch_team
jetzt. Alternativ fügen Sie einfach Spaltenmatch_team
.Könnte ich hinzufügen Ansichten für die typisch zeigt, wie:
Grundlegende Ratschläge:
Ich glaube, Sie brauchen, um zu verfolgen die teams zu Gruppen irgendwo. So etwas wie:
dann müssen Sie die Spiele-Tabelle werden zwei Fremdschlüssel gegen diese. Dann ist Ihre Statistik-Tabelle Bezug, sowie.
Könnte man aso erstellen Sie mehrere Fremdschlüssel aus team_statistics zu spielen, sondern, wenn Sie dies tun, werden Sie eine Unfähigkeit zu packen-Statistiken bis ein team sowohl auf der einen Seite und der anderen Seite des Spiels.
Wenn ich Ihr Konzept richtig, hier ist ein Beispiel: