2016-11-04 13 views
1

Ich habe zwei Tabellen, Team und Player (eins zu viele).Ist es in Ordnung, wenn zwei Tabellen sich gegenseitig referenzieren?

Meine erste Frage, ist es eine schlechte Übung, dass beide Tabellen sich gegenseitig so referenzieren?

Team: (id (pk), name, captain_id (fk)) 
Player: (id (pk), name, team_id (fk)) 

Ich bin mit JPA und mit dem folgende Setup überwintert.

In dem Moment, in dem ein neues Team erstellt wird, wird die ID des Players, der es erstellt, als Parameter übergeben. Es funktioniert gut, aber es fühlt sich nicht richtig an, es manuell zu tun.

public void createNewTeam(Player player, Team team){ 

    Set<Player> players = new HashSet<Player>(); 
    Team team = new Team("Cowboys", player.getId(), players); //player.getId is the captain() 

    player.setTeam(team); 
    players.add(player); 

    PersistenceUtil.merge(team);  
} 

Gibt es eine Möglichkeit, die Entitäten irgendwie zu ändern, um dies automatisch zu tun? Oder muss ich die Tabellen ändern?

Ich habe versucht, die Objekte mit Gson in JSON zu konvertieren, aber ohne Erfolg. Ich denke, es hat etwas mit Zirkularreferenzierung zu tun. (ja ich bin ein Noob in zu tief!)

+0

Natürlich ist es in Ordnung, eine 1-N BIDIREKTIONALE Beziehung zu haben, deshalb existiert die Beziehung! Setze beide Seiten der Relation –

Antwort

-1

Es ist möglich, aber ziemlich begrenzend. Wenn Sie zuerst ein Team hinzufügen, sollte der Kapitän leer sein, da Sie noch keinen Spieler erstellt haben. Dann musst du dein Team aktualisieren, nachdem der Spieler-Captain erstellt wurde. Das gleiche Problem ist umgekehrt.

Ich würde mit beweglichem Kapitän Eigenschaft zu einem Spieler starten:

Team: (id (pk), name) 
Player: (id (pk), name, team_id (fk), is_captain) 

Auf diese Weise haben Sie nicht das Updates hin und her zu tun.

Ihre Funktion wird in etwa so aussehen:

public void createNewTeam(Player player, Team team){ 

Set<Player> players = new HashSet<Player>(); 
Team team = new Team("Cowboys", players);  

player.isCaptain(true); 
player.setTeam(team); 
players.add(player); 

PersistenceUtil.merge(team);  
} 
+0

Ich hätte erwähnen sollen, dass der Spieler/Kapitän das Team erstellt, so dass es unmöglich ist, ein Team vor dem Spieler zu erstellen. Wäre Ihre Antwort in diesem Fall der bessere Weg? – superwelling

+0

'Es ist möglich, aber ziemlich einschränkend '-> vielleicht ist es möglich, aber definitiv schlechte Praxis und falsch zu tun. –

0

Was Sie hier beschrieben:

Team: (id (pk), name, captain_id (fk)) 
Player: (id (pk), name, team_id (fk)) 

falsch ist, und sollte nicht so konfiguriert werden.

wenn Sie einen Viele Assoziation zwischen zwei Einheiten konfigurieren möchten,

dann der richtige Weg, es zu tun ist durch:

zunächst entscheiden, welche Unternehmen die Many und Wille, der sein sei Single (One), in unserem Fall ist es ziemlich einfach. Jeder Spieler gehört zu One Team, und jedes Team hat Many Spieler.

Team -> One

Player -> Viele

Zweitens, wenn Sie versuchen, die Verbindung mit den Tabellen zu vertreten, dann die vielen (Player) sollte fk of One (Team) besitzen , und Team sollte nicht fk des Spielers halten, es sollte nur ein fk in dieser Assoziation sein.

Warum?

Lassen Sie uns sagen, dass Sie ein Team auf Team Tisch mit PK 211, hat das Team viele Spieler die Spieler mit IDs von 100 sagen wir, 101, 102

Sie nicht 3 Datensätze haben kann (für 3 verschiedene Spieler 100, 101, 102) auf Teamtisch mit dem gleichen PK 211

0

Ich denke, es muss eine Admin-Person geben, die sowohl Teams als auch Spieler hinzufügt. Zuerst kann er ein Team mit grundlegenden Details über das Team wie Name und Beschreibung erstellen. Dann kann er einen Spieler mit seinen Details hinzufügen, wählen Sie eine Mannschaft für ihn und eine Flagge, um anzuzeigen, ob er der Kapitän ist.

Also wären die Tabellenstrukturen so.

Team: (id (pk), name, description). 
Player: (id (pk), name, team_id (fk), is_captain). 

Aber wie Sie sagten, ein Spieler kann das Team erstellen, dann ist es möglich, dass jeder Spieler ein Team erstellen kann. Sie müssen dies also durch eine bestimmte Rolle kontrollieren.

Der gute Ansatz wird also sein, zuerst das Team und dann die Spieler durch einen Admin zu ergänzen.

Verwandte Themen