Modelado de Jerarquías Todo-Parte con Bases de Datos (Herencia)

Juan Mellado, 6 Marzo, 2007 - 17:41

Un tipo de organización que suele utilizarse con bastante frecuencia en el mundo real es la jerarquía. Por ejemplo, la mayoría tenemos un jefe del que dependemos, y este a su vez tiene otro jefe. Desde nuestro punto de vista, nuestro jefe es nuestro responsable y nosotros sus empleados. Pero desde el punto de vista de nuestro jefe, él es a su vez un empleado de su propio jefe. La característica común que compartimos dentro de la jerarquía, y que nos hace pertenecer a ella, es que en realidad todos somos empleados. Nuestro puesto concreto de trabajo simplemente determina nuestra posición dentro de la jerarquía.

Con las familias ocurre algo parecido. Los padres tienen hijos que acaban convirtiéndose a su vez en padres, al tiempo que todos también son a un mismo tiempo hermanos, primos, tíos, cuñados, suegros, abuelos, ... Familiares, en resumidas cuentas.

El ejemplo paradigmático de este tipo de estructuras en informática son los sistemas de archivos, como los que utilizamos normalmente para organizar el contenido de nuestros discos duros, en donde un archivo puede ser, o bien un fichero, o bien un directorio. El quid del asunto está en que un directorio a su vez puede contener otros ficheros o directorios, lo que lo convierte por si mismo en un nuevo sistema de archivos dentro del sistema de archivos que lo contiene. La parte se convierte en un todo, de ahí el nombre de este tipo de estructuras.

Existe un patrón de diseño llamado "Composite" que aprehende completamente y de una forma muy elegante este tipo de jerarquías.

Composite

En el diagrama UML se observan tres clases. La clase "Archivo" sería la representación idealizada de todos los elementos que componen nuestro sistema, con los atributos y métodos que comparten en común, como el hecho de tener un nombre, permisos, o una series de fechas (creación, modificación, último acceso, ...). La clase "Fichero" sería un elemento concreto e individual del que no pueden depender otros, como un fichero de texto o una imagen por ejemplo. Y por último, la clase "Directorio" sería una agregación de objetos heredados de la clase "Archivo", que como acabamos de ver, pueden ser ficheros individuales u otros directorios a su vez. Es esta última agregación la que proporciona la recursividad necesaria para modelar correctamente el sistema.

El modelo físico de una base de datos que implemente este patrón puede realizarse de muchas formas, pero fundamentalmente me gustaría destacar dos puntos concretos. Por una parte el modelado de la relación de herencia, y por otra parte el modelado de la relación de agregación.

La herencia se implementa tradicionalmente de dos formas. La primera de ellas consiste en crear una tabla distinta para cada entidad, lo que resultaría, siguiendo con nuestro ejemplo, en una tabla para "Fichero" y otra para "Directorio". La segunda forma consiste en crear una única tabla para todas las entidades, con una columna que permite distinguir el tipo concreto al que pertenece cada registro insertado en la misma. En nuestro ejemplo, con esta última forma de implementación, resultaría en una única tabla para "Archivo" con una columna "tipo" que indicaría si un registro corresponde a un directorio o un fichero.

Particularmente no creo que exista un criterio válido universal a través del que decidir cual de las dos soluciones anteriores es la más adecuada. Dado el dominio del problema, yo me inclinaría por la segunda alternativa, utilizando una única tabla para todos los elementos, sobre todo porque es bastante probable que en un futuro se quieran introducir más elementos de distinto tipo en la jerarquía, aparte de ficheros o directorios, como por ejemplo "accesos directos". Haciéndolo con una sola tabla se consigue un tratamiento más homogéneo de la información capturando la esencia de la relación "es un" implícita en el modelo.

Lo que debe quedar claro en cualquier caso, es que la forma en la que se implemente la herencia decidirá la forma en la que se implemente la agregación, algo de lo que hablaré en un próximo post.

¿No encontró lo que buscaba?

Utilice el buscador para encontrar más páginas en esta web o en toda Internet.
 
Web www.inmensia.com