node.js - TypeORM. Zwei Fremdschlüssel verweisen auf denselben Primärschlüssel in einer Tabelle
In meinem Projekt möchte ich bidirektionale ManyToOne - OneToMany-Beziehungen mit zwei Fremdschlüsseln haben, die auf denselben Primärschlüssel verweisen. In meinem Fall wäre es eine Tabelle 'match', die zwei Spieler aus der Tabelle 'player' enthält (player1Id und player2Id sind FK). Ich möchte in der Lage sein, alle Matches, in denen ein bestimmter Spieler gespielt hat, abzurufen sowie einen Spieler dem Match zuzuordnen. In der Match-Entität sollte es meiner Vermutung nach ungefähr so aussehen:
@Entity()
export class Match {
@PrimaryGeneratedColumn()
id!: number;
@ManyToOne((type) => Player)
@JoinColumn({ name: "player1Id", referencedColumnName: "id" })
player1: Player;
@ManyToOne((type) => Player)
@JoinColumn({ name: "player2Id", referencedColumnName: "id" })
player2: Player;
//some other properties...
aber da ich eine inverse Seite Entity im @OneToMany() Dekorator angeben muss, wie sollte es dann in der Player-Entity aussehen? Gibt es eine Möglichkeit, eine solche Assoziation in TypeORM zu mappen, und ist es eine gute und übliche Praxis, zwei FK in einer Tabelle zu haben, die auf denselben Primärschlüssel in einer anderen Tabelle verweisen? Ich bin neu in NodeJS und Webentwicklung im Allgemeinen. Danke für jede Hilfe.
Antwort #1
Für mich sieht es so aus, als hättest du hier eine Viele-zu-Viele-Beziehung. Ein Match hat viele Spieler (selbst wenn du nur zwei brauchst, könntest du die Anzahl der Spieler immer skalieren), und ein Spieler kann bei vielen Matches sein.
@Entity()
export class Match {
@PrimaryGeneratedColumn()
id!: number;
@ManyToMany((type) => Player, (player) => player.matches)
players: Player[];
//some other properties...
Die Spieler-Entität. Wenn Sie die Beziehung tatsächlich viele zu viele machen, müssen Sie @JoinTable() bei einer der Entitäten platzieren.
@Entity()
export class Player{
@PrimaryGeneratedColumn()
id!: number;
@ManyToMany((type) => Match, (match) => match.players)
@JoinTable()
matches: Match[];
//some other properties...
