Consideriamo i seguenti oggetti:
- Articolo che può essere di tipi diversi
- Apparecchiature che indicano un articolo, alcuni campi sull'attrezzatura sono usati solo per alcuni tipi.
Voglio aggiungere un vincolo all'apparecchiatura, questo vincolo dipende dal tipo o dall'articolo. Ho tre scelte:
- Utilizza i trigger in modo da poter interrogare il tipo di articolo con un'altra selezione
- Pro: solo lavori nel database
- Monete: selezione extra. Fino ad ora mi astenevo dall'usare i trigger per il vincolo "statico (/ generico?)" (= Non dipendente dal vecchio valore come si può fare nel trigger e non in CHECK).
- copia il article_type in una colonna dedicata di attrezzature in modo che io possa applicare un CONTROLLO DI CONTROLLO.
- Pro: facili da implementare, tutti si inseriscono nella stessa tabella
- Monete: colonna extra dedicata.
- Utilizzare l'ereditarietà per ogni tipo di articolo e ogni tipo di attrezzatura
- Pro: applica un vincolo differente su ciascuna tabella risultante
- Monete: più tabelle da gestire, UNION / JOINS a seconda dell'implementazione.
La seconda soluzione sarebbe implementata in questo modo nella parte ORM:
// ensure we're accessing using getter and not the non-existant field.
@Access(AccessType.PROPERTY)
@Enumerated(EnumType.STRING)
public ArticleTypeEnum getTypeOfArticle(){
return article.getType();
};
protected void setTypeOfArticle(ArticleTypeEnum aEnum){
// ignore silently
}
Quindi questo è abbastanza facile e l'articolo non sarà mai nullo quando verrà chiamato il getter.
La terza soluzione non è attualmente considerata da me, ma fa parte della domanda.
Questo è a causa di altri requisiti: essere in grado di interrogare in modo trasparente tra ogni tipo dalla stessa vista. Questo non è tecnicamente possibile per JPA per interrogare campi specifici per uno dei tipi, avrei bisogno di una soluzione complicata per questo, se è fattibile, considerando il mio stack corrente.
Quindi la mia analisi è giusta? Ci sono altre alternative?
La mia domanda non si applica solo per l'analisi di questo solo campione ma dell'intero database, che probabilmente si tradurrà in una risposta dipende .
Finaly è il metodo 2 ha un nome? Quindi potrei cercare forse ulteriori informazioni qui in rete.