Tengo 3 modelos Person
, Role
y Position
las personas que representan en un club de fútbol como
public class Person {
private Long id;
private String name;
private Role role;
}
public class Role {
private Long id;
private String name; //like manager, goalkeeping_coach, player
}
public class Position {
private Long id;
private String name; //striker, midfielder, defender, goalkeeper
}
El problema es que position
sólo tiene sentido para una persona si es su papel player
. Así que si lo hago
public class Person {
private Long id;
private String name;
private Role role;
private Position position;
}
a continuación, para todos los person
casos que no tienen el papel de player
, el position
campo va a almacenar valores nulos. Del mismo modo, puede haber otros atributos que tienen sentido sólo para manager
y / o goalkeeping_coach
instancias.
He intentado hacer la Person
clase abstracta
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Person {
private Long id;
private String name;
private Role role;
}
public class Player extends Person {
private Position position;
}
public class Manager extends Person {
}
Esto hará que el player
e manager
instancias para ser salvo en tablas diferentes. Pero el problema que surge ahora es si el role
de los person
cambios (por ejemplo un jugador se retira y se convierte en el gerente del club). Entonces tendría que mover la fila de una tabla a otra (digamos eliminar la player
instancia y crear una nueva manager
instancia utilizando los mismos datos, excluyendo el position
de datos), lo cual no parece ser una buena manera de ir.
Entonces, ¿cuál sería la mejor manera de manejar esta situación? ¿Está bien tener valores nulos como en el primer caso?
El requisito es que la conexión entre una Person
y Role
se puede cambiar.
El modelo puede reflejar que si se hace una mesa para esta conexión, así como la conexión entre Person
yPosition
// Person table has only Person details
public class Person {
private Long id;
private String name;
}
// Role table has only Role details
public class Role {
private Long id;
private String name; //like manager, goalkeeping_coach, player
}
// Position table has only ...
public class Position {
private Long id;
private String name; //striker, midfielder, defender, goalkeeper
}
// connection of Person and Role
public class PersonRole {
private Long person_id;
private Long role_id;
}
// connection of Person and Position
public class PersonPosition {
private Long person_id;
private Long position_id;
}
Este diseño resuelve el requisito de la persona papeles cambiantes y también de la relevancia condicional de posición. También atiende a las necesidades futuras como una persona que tenga múltiples roles y posiciones
EDITAR : pensé que lo que he descrito es en realidad el modelo de base de datos. en el Java puede modelar las tablas de conexión como relación de muchos a muchos (si se utiliza algún ORM)