El mejor enfoque para manejar campos condicionales en un modelo

Kshitij Bajracharya:

Tengo 3 modelos Person, Roley Positionlas 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 positionsó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 personcasos que no tienen el papel de player, el positioncampo va a almacenar valores nulos. Del mismo modo, puede haber otros atributos que tienen sentido sólo para managery / o goalkeeping_coachinstancias.

He intentado hacer la Personclase 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 playere managerinstancias para ser salvo en tablas diferentes. Pero el problema que surge ahora es si el rolede los personcambios (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 playerinstancia y crear una nueva managerinstancia utilizando los mismos datos, excluyendo el positionde 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?

Sharon Ben Asher:

El requisito es que la conexión entre una Persony Rolese puede cambiar.
El modelo puede reflejar que si se hace una mesa para esta conexión, así como la conexión entre PersonyPosition

// 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)

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=209559&siteId=1
Recomendado
Clasificación