Ho difficoltà a valutare una decisione progettuale riguardante le relazioni di entità in un modello di dati di persistenza JavaEE.
Diciamo che voglio progettare un semplice modello di dati che dovrebbe rappresentare un'orchestra da camera composta da diversi tipi di musicisti.
Per ora so che ci sarà un suonatore di flauto, un pianista, un violinista e un contrabbassista, ma è previsto che nel corso della vita del sistema vengano aggiunti altri tipi di musicisti imprevedibili. Pertanto il mio supervisore mi ha detto non di usare un'entità separata per ogni tipo di musicista, come FlutePlayer
, PianoPlayer
ecc., Ma invece ha un'entità Musician
con un attributo di tipo enumeration Instrument
, in modo che i nuovi tipi di
i musicisti possono essere aggiunti successivamente al sistema facilmente aggiungendo un valore a tale enumerazione.
D'altra parte, so per certo che ogni orchestra avrà sempre esattamente un pianista e esattamente un contrabbassista e mi piacerebbe poterli accedere comodamente. Ecco perché penso che sarebbe utile avere un attributo pianoPlayer
e contrabassPlayer
anziché solo un insieme di musicians
in ChamberOrchestra
. Pensa all'orchestra come un'orchestra esecutiva, quindi un musicista non può far parte di più di un'orchestra alla volta.
Ma quando si implementa questo, le cardinalità per le associazioni mi sembrano un po 'strane perché stabiliranno una relazione asimmetrica tra ChamberOrchestra
e Musician
: one-to-one in one
direzione e molti-a-uno nella direzione opposta.
Ho già sperimentato un po 'questo approccio e finora fa ciò che mi aspetto, ma la menzionata asimmetria mi turba un po' e poiché non ho esperienza nella progettazione di modelli di dati sono un po 'preoccupato che un tale progetto potrebbe avere conseguenze negative più in là.
Quindi, per avere una domanda concreta, va bene o sarebbe considerata una cattiva pratica avere una relazione asimmetrica tra entità nel senso schematizzato nel codice qui sotto?
@Entity
public class ChamberOrchestra {
@OneToOne
@JoinColumn("PIANO_PLAYER_ID")
protected Musician pianoPlayer;
@OneToOne
@JoinColumn("CONTRABASS_PLAYER")
protected Musician contrabassPlayer;
public Musician getPianoPlayer() {
return pianoPlayer;
}
public Musician getContrabassPlayer() {
return contrabassPlayer;
}
}
@Entity
public class Musician {
@ManyToOne
@JoinColumn("CHAMBER_ORCHESTRA_ID")
protected ChamberOrchestra chamberOrchestra;
@Column
protected Instrument instrument;
public ChamberOrchestra getChamberOrchestra() {
return chamberOrchestra;
}
public Instrument getInstrument() {
return instrument;
}
}