El 1 de noviembre de 2009 11:40, niquefa
<niq...@gmail.com> escribió:
Hola a todos, la duda es la siguiente:
Cuando tengo una relación uno a muchos, por ejemplo Fase -
MateriaPrima, en donde una Fase tiene varias materias primas
implementadas. De la relación, sale que cada materia prima tiene un
"nuevo atributo" llamado turno pero que surge solo cuando se le
relaciona con una Fase; es decir, cada MateriaPrima tiene un turno
dentro de la Fase a la que pertenece.
Usted lo ha dicho, este atributo hace parte de la relación, no es de la materia prima en sí.
Notando que las entidades van a representar datos en nuestro sistema, podríamos aprovechar las investigaciones que han surgido acerca de cómo crear una base de datos correctamente. La primera información a revisar será la de la normalización de las bases de datos, donde encontraremos reglas como la expuesta en:
http://www.datamodel.org/NormalizationRules.html#three Donde (y recordando algunso consejos del profesor Tito Florez Calderón) una tabla debe guardar solamente información que le sea relevante. En el caso propuesto, el turno no hace parte de la materia prima, sino que es un atributo resultante de la relación creada entre materia prima y fase.
¿Como se debe modelar esto en las clases entidad?
La primera idea que tuve fué crear un atributo turno en MateriaPrima y
dejarlo sin usar mientras dicha materia prima no se relacione con
ninguna fase, pero no estoy seguro de la conveniencia de eso.
Esta aproximación tendría dos problemas:
Primero, como ya usted lo ha expuesto, este atributo no se usaría mientras esta materia prima no sea asignada a una fase. Esto tiene más consecuencias, por ejemplo, si tenemos una materia prima que sea usada en dos fases diferentes, por ejemplo (no estoy familiarizado con su aplicación, por lo cual daré un ejemplo general), si la pintura es usada en la fase "pintar" y "retocar", entonces se crearía un problema con el turno, además del problema lógico de "información innecesaria" en esta clase.
Segundo, siguiendo el concepto de normalización, notaremos que el turno no hace parte de la materia prima.
Lo segundo que pensé fué crear una nueva clase Entidad (otro .java)
llamado FaseMateriaPrima que tuviera como atributos el código de la
Fase, el código de la MateriaPrima y un atributo entero turno, pero
una vez mas, no se que tan conveniente sea eso ni porque.
Sería esta, entonces, una clase relacional entre MateriaPrima y Fase, desde mi punto de vista sería una mejor opción que la anterior, de hecho sería la que yo usaría, con esto tendríamos que el turno hace parte de esta relación, tal y como la conceptualización del problema nos lo demuestra.
¿Cual aproximación es mejor seguir de las dos que expuse y porque?, ¿o
existe alguna mejor y porque?
Considero entonces, basándome en la teoría que se ha desarrollado acerca de normalización de bases de datos, que la segunda opción sería la mejor, y, por ahora, no se me ocurre alguna mejor. Sin embargo, debo destacar que el uso de "código" de materia prima y fase no serían como tal, sino, mejor, una asociación (quizás una agregación) hacia dichas clases, lo que nos representaría un apuntador a los objetos que contendrían el código y podríamos obtener mucha más información sin necesidad de hacer comparación por códigos.
De antemano gracias
Con gusto, espero haber colaborado con en análisis de este tema. Hasta luego,
--
Miguel Cubides
Ingeniería de Sistemas
Universidad Nacional