Gimenoblog
Mapeo objeto-relacional (herencia III)
Septiembre 26th, 2005 - [Enlace local]
Hola. Este es último post sobre el mapeo objeto-relacional y la herencia. Sólo queda ver la última estrategia: Una tabla por cada jerarquía de herencia. Voy a ser muy escueto puesto que no he recibido opiniones ni sugerencias en los otros posts. Por supuesto sigo con el modelo de datos de los temas anteriores (alumno, profesor,...).
Con esta estrategia vamos a guardar en la misma tabla una jerarquía de herencia completa. Es decir haremos una tabla "personas" en la que se guardarán tanto los objetos Profesor como los objetos Alumno. En la tabla "personas" tendremos tantas columnas como campos tenga la clase Persona más los campos de la clase Profesor y además los de la clase Alumno. Además deberemos tener una columna "discriminadora" que servirá para especificar el tipo concreto de objeto que contendrá cada fila. Veamos cómo se crea la tabla "personas"
CREATE TABLE personas (nif INTEGER NOT NULL,
nombre VARCHAR(50),
apellidos VARCHAR(50),
fecha_nacimiento DATE,
numero_creditos_cursados INTEGER,
id_departamento INTEGER,
tipo_persona ENUM("profesor", "alumno"),
PRIMARY KEY(nif)) TYPE=INNODB;
La última columna ("tipo_persona") indica si la fila de la tabla contiene un profesor o un alumno. Por lo tanto al hacer un listado el pseudo-código sería...
ResultSet result = ...; Listpersonas = new ArrayList (); while(result.next()) { if(columna tipo_persona es "profesor") { Profesor profesor = new Profesor(); // rellenar profesor personas.add(profesor); } else if(columna tipo_persona es "alumno") { Alumno alumno = new Alumno(); // rellenar alumno personas.add(alumno); } } return personas;
Esta estrategia es muy buena en cuanto a rendimiento porque todo está en una única tabla y no hay que hacer "joins" ni "unions" para hacer un listado de todas las personas.
El inconveniente de esta estrategia es que no podemos establecer NOT NULL a las columnas de las subclases. Por ejemplo si "numero_creditos_cursados" es obligatorio para alumnos, pero esta columna no puede ser NOT NULL porque es un campo que no existe para profesores. Es decir, es una columna obligaroria para cierta subclase pero no para otras.