Ejemplo 2

Nota: a fecha de 12/04/2012 he detectado un error en el modelado de este ejemplo. El atributo "cagegoría" de libro debe ser en realidad un atributo de ejemplar. Esto es porque lo que prestamos son ejemplares, no libros. En la realidad la categoría queda definida para cada ejemplar. Podemos tener para el mismo libro ejemplares que no se puedan prestar (primeras ediciones, encuadernaciones antiguas, etc), y ejemplares que sí se puedan prestar (ediciones en rústica, copias digitales, etc). He modificado los textos del ejemplo 2 en todo el curso para corregir este error.

Nuestro segundo ejemplo es más complicado. Se trata de gestionar una biblioteca, y nuestro cliente quiere tener ciertas herramientas a su disposición para controlar libros, socios y préstamos. Adicionalmente se necesita un control de los ejemplares de cada libro, su ubicación y su estado, con vistas a su retirada o restitución, para esto último necesita información sobre editoriales a las que se deben pedir los libros.

Tanto los ejemplares como los socios estarán sujetos a ciertas categorías, de modo que según ellas cada ejemplar podrá ser o no prestado a cada socio. Por ejemplo, si las categorías de los ejemplares van de A a F, y la de los socios de B a F, un ejemplar de categoría A nunca puede ser prestado a ningún socio. Estos ejemplares sólo se pueden consultar en la biblioteca, pero no pueden salir de ella. Un ejemplar de categoría B sólo a socios de categoría B, uno de categoría C se podrá prestar a socios de categorías B y C, etc. Los ejemplares de categoría F siempre pueden prestarse.

El sistema debe proporcionar también un método de búsqueda para libros por parte de los socios, por tema, autor o título. El socio sólo recibirá información sobre los libros de los que existen ejemplares, y sobre la categoría.

Además, se debe conservar un archivo histórico de préstamos, con las fechas de préstamo y devolución, así como una nota que el responsable de la biblioteca quiera hacer constar, por ejemplo, sobre el estado del ejemplar después de su devolución. Este archivo es una herramienta para la biblioteca que se puede usar para discriminar a socios "poco cuidadosos".

Los préstamos, generalmente, terminan con la devolución del libro, pero algunas veces el ejemplar se pierde o el plazo supera un periodo de tiempo establecido y se da por perdido. Estas circunstancias pueden cerrar un préstamo y provocan la baja del ejemplar (y en ocasiones la del socio :-). Nuestro archivo histórico debe contener información sobre si el libro fue devuelto o perdido.

Identificar conjuntos de entidades

En lo que se refiere a los libros, podemos considerar los siguientes conjuntos:

  1. Libro: contiene la información relativa a las publicaciones.
  2. Tema: temas en los que clasificaremos los contenidos de los libros, esto facilitará las búsquedas y consultas por parte de los socios.

Sobre el tema habría mucho que hablar. Podríamos guardar el tema como un atributo de libro, pero en la práctica será deseable considerar este atributo como una entidad, y establecer una interrelación entre el libro y los temas. Esto nos permitiría elegir varios temas para cada libro, y nos facilitará las búsquedas de libros.

  1. Autor: contiene información sobre autores, hay que tener en cuenta que un libro puede no tener autor (caso de libros anónimos), y también puede tener uno o varios autores (recopilaciones y colaboraciones).
  2. Editorial: necesitamos un conjunto de entidades para ellas, ya que deberemos hacer pedidos de libros y esos pedidos se hacen a editoriales.
  3. Ejemplar: para cada libro podemos tener uno o varios ejemplares. Cada ejemplar es una entidad, de hecho, es posible que tengamos entidades en nuestra base de datos de libros de los que no tenemos ningún ejemplar. Esto también nos permitirá hacer seguimiento de ejemplares concretos, mantener información sobre distintas ediciones del mismo libro, el estado en que se encuentra, diferentes formatos del libro (papel, informático o sonoro), etc.

Otros conjuntos de entidades serán:

  1. Socio: con la información sobre cada socio.

Podemos tener ciertas dudas sobre si ciertas características del modelo son entidades o relaciones. Por ejemplo, el préstamo puede ser considerado como una interrelación entre un socio y un ejemplar. Sin embargo, necesitaremos alguna información extra sobre cada préstamo, como la fecha de préstamo y la de devolución.

De hecho, lo consideraremos como una entidad compuesta, que relacionará un socio con un ejemplar, (no prestamos libros, sino ejemplares) y al que añadiremos un atributo con la fecha de préstamo.

  1. Préstamo: entidad compuesta con información sobre cada préstamo.

Otro concepto difícil de catalogar puede ser el de las categorías. Puede ser un atributo o una entidad, dependiendo de si necesitamos más atributos para definirlas o no. Hay que tener en cuenta que tanto los libros como los socios pertenecen a una categoría, lo que tenemos que decidir es si se trata del mismo conjunto de categorías o no.

En principio, y si no nos vemos obligados a cambiar el modelo, parece que lo más lógico es considerar las categorías como un atributo de las entidades ejemplar y socio.

Nuestro cliente, además, dice que quiere conservar un archivo histórico de los préstamos. Necesitamos por lo tanto, otro conjunto de entidades para el histórico de préstamos. Sin embargo, al buscar las interrelaciones veremos que no necesitamos esta octava entidad.

Identificar conjuntos de interrelaciones

Llega el turno de buscar las interrelaciones entre los conjuntos de entidades que hemos definido. Las primeras que encontramos son las existentes entre libro y tema, libro y autor, del tipo N:M.

Entre libro y editorial, existe una relación N:1.

Entre libro y ejemplar la relación es del tipo 1:N. En este caso, además, los ejemplares son entidades subordinadas a libro. La interrelación, por lo tanto se convierte en una entidad compuesta.

Podríamos haber establecido un conjunto de relaciones entre ejemplar y editorial, del tipo 1:N; en lugar de hacerlo entre libro y editorial. Esto es si consideramos posible que un mismo libro se edite por varias editoriales, pero para este modelo consideraremos que un mismo libro editado por distintas editoriales, son en realidad varios libros diferentes.

Otro conjunto de interrelaciones es la que existe entre ejemplar y socio, de tipo N:M. Ya dijimos que esta interrelación será en realidad una entidad compuesta.

El último conjunto de interrelaciones es entre préstamo y su historial, en este caso, consideraremos el historial como una entidad subordinada a préstamo.

Pero consideremos la posibilidad de hacer una generalización entre las entidades préstamo e historial, a fin de cuentas, una entidad de historial es un préstamo cerrado, contendrá la misma información que un préstamo abierto, más algunos datos sobre el cierre.

De este modo tampoco necesitaremos un atributo discriminador creado al efecto, podemos considerar que si la fecha de devolución es nula, el préstamo está abierto.

Trazar primer diagrama

Trazaremos ahora nuestro primer diagrama:

1er diagrama de biblioteca

Identificar atributos

Iremos entidad por entidad:

  1. Libro: guardaremos el título. Además, como el título no es único, ya existen muchos libros con el mismo título, necesitaremos un atributo para usar como clave primaria, la clavelibro. Añadiremos también algunos atributos como el idioma, título e idioma originales (para traducciones), formato, etc. Podemos añadir algún otro atributo informativo, como el código ISBN, que facilita su petición a la editorial.
  2. Tema: igual que con la entidad libro, guardaremos el nombre del tema y un atributo clavetema para usar como clave primaria.
  3. Autor: el nombre del autor. Podemos añadir algún dato sobre el autor, biográfico o de cierta utilidad para realizar búsquedas en detalle. También crearemos un atributo para usarlo como clave principal, al que llamaremos claveautor.
  4. Editorial: atributos interesantes para hacer peticiones de nuevos libros: nombre, dirección y teléfono.
  5. Ejemplar: edición, ubicación en la biblioteca y categoría. También necesitaremos un identificador de orden, para poder distinguir entre varios ejemplares idénticos.
  6. Socio: guardaremos el nombre, fecha de alta, categoría y, por supuesto, un identificador para usar como clave primaria: el número de socio.
  7. Préstamo/historial: necesitamos la fecha de préstamo y de devolución, así como un atributo de comentarios.

Identificar claves principales

No todas las entidades necesitarán una clave principal, veamos cuales necesitamos:

En el caso de libro, tema, autor, editorial y socio disponemos de atributos creados específicamente para ser usados como claves principales.

Para ejemplar, en principio, al tratarse de una entidad subordinada, no necesitaría una clave principal, pero como interviene en la interrelación de préstamo sí la necesitaremos. Esta clave se crea mediante la combinación de la clave principal de libro y un atributo propio de ejemplar, que será el identificador de orden.
Sin embargo, esta clave compuesta puede generar problemas a la hora de crear claves foráneas, de modo que es mejor crear una clave primaria específica.

La entidad préstamo/historial es compuesta. En principio, con las claves de socio y ejemplar debería ser suficiente para identificar un préstamo concreto, pero es posible que el mismo socio pida prestado el mismo ejemplar más de una vez. Estaremos, por lo tanto, obligados a usar un atributo extra para definir una clave candidata. Ese atributo puede ser, y de hecho debe ser, la fecha de préstamo. De todos modos, esta entidad no precisa de clave principal, ya que no interviene en ninguna interrelación. Si fuese necesaria, no sería posible usar el conjunto de atributos de clave de socio, clave de libro, número de orden y fecha, ya que algunos de ellos podrían ser nulos (si se dan de baja socios o ejemplares).

Verificar el modelo

Trazaremos ahora nuestro diagrama completo:

2º diagrama de biblioteca