Segundo Trabajo de Bases de Datos 2 (14%) Semestre 2015 – 2 Por favor lea todo el enunciado y los ejemplos. A continuación se presenta una tabla donde se indican los tipos de locales que se pueden encontrar en un centro comercial: SITIOS TIPO DESCRIPCIÓN B01 Banco R01 Restaurante T01 Tienda de Ropa T02 Tienda de Calzado L01 Librería A continuación se presenta una tabla donde se indican los locales ubicados en un centro comercial: CREATE TABLE local( id NUMBER(8) PRIMARY KEY, nombre VARCHAR(50) NOT NULL, categoria NUMBER(1) NOT NULL CHECK(categoria BETWEEN 1 AND 5), tipo VARCHAR(3) NOT NULL, coordenadas XMLTYPE ); Ejemplos: INSERT INTO local VALUES( 0, 'A', 5, 'T01', XMLTYPE( '<coordenadas> <x1>60</x1> <y1>0</y1> <x2>80</x2> <y2>10</y2> </coordenadas>' ) ); INSERT INTO local VALUES( 1, 'B', 5, 'B01', XMLTYPE( '<coordenadas> <x1>10</x1> <y1>10</y1> <x2>20</x2> <y2>20</y2> </coordenadas>' ) ); INSERT INTO local VALUES( 2, 'C', 1, 'L01', XMLTYPE( '<coordenadas> <x1>20</x1> <y1>20</y1> <x2>40</x2> <y2>40</y2> </coordenadas>' ) ); INSERT INTO local VALUES( 3, 'D', 3, 'R01', XMLTYPE( '<coordenadas> <x1>0</x1> <y1>30</y1> <x2>10</x2> <y2>50</y2> </coordenadas>' ) ); INSERT INTO local VALUES( 4, 'E', 2, 'B01', XMLTYPE( '<coordenadas> <x1>80</x1> <y1>30</y1> <x2>100</x2> <y2>50</y2> </coordenadas>' ) ); INSERT INTO local VALUES( 5, 'F', 1, 'R01', XMLTYPE( '<coordenadas> <x1>60</x1> <y1>40</y1> <x2>70</x2> <y2>70</y2> </coordenadas>' ) ); INSERT INTO local VALUES( 6, 'G', 4, 'T02', XMLTYPE( '<coordenadas> <x1>30</x1> <y1>50</y1> <x2>50</x2> <y2>60</y2> </coordenadas>' ) ); INSERT INTO local VALUES( 7, 'H', 2, 'T02', XMLTYPE( '<coordenadas> <x1>0</x1> <y1>60</y1> <x2>10</x2> <y2>90</y2> </coordenadas>' ) ); INSERT INTO local VALUES( 8, 'I', 3, 'T01', XMLTYPE( '<coordenadas> <x1>70</x1> <y1>70</y1> <x2>80</x2> <y2>80</y2> </coordenadas>' ) ); INSERT INTO local VALUES( 9, 'J', 3, 'T01', XMLTYPE( '<coordenadas> <x1>20</x1> <y1>90</y1> <x2>30</x2> <y2>100</y2> </coordenadas>' ) ); INSERT INTO local VALUES( 10, 'K', 2, 'L01', XMLTYPE( '<coordenadas> <x1>90</x1> <y1>90</y1> <x2>100</x2> <y2>100</y2> </coordenadas>' ) ); A continuación se presenta una tabla donde se indican las trayectorias de visitantes (las trayectorias de cada visitante corresponden a un solo día): CREATE OR REPLACE TYPE nest_docsXML AS TABLE OF XMLTYPE; / CREATE TABLE historial_visitante( identificacion NUMBER(8) PRIMARY KEY, trayectorias nest_docsXML )NESTED TABLE trayectorias STORE AS store_trayectorias; Ejemplos: INSERT INTO historial_visitante VALUES( 1, nest_docsXML( XMLTYPE('<trayectoria> <punto> <x>40</x> <y>0</y> <tiempo>8:00</tiempo> </punto> <punto> <x>50</x> <y>0</y> <tiempo>8:05</tiempo> </punto> <punto> <x>20</x> <y>20</y> <tiempo>8:10</tiempo> </punto> <punto> <x>10</x> <y>50</y> <tiempo>8:20</tiempo> </punto> <punto> <x>20</x> <y>50</y> <tiempo>8:25</tiempo> </punto> <punto> <x>50</x> <y>70</y> <tiempo>8:35</tiempo> </punto> </trayectoria>') ) ); INSERT INTO historial_visitante VALUES( 2, nest_docsXML( XMLTYPE('<trayectoria> <punto> <x>10</x> <y>10</y> <tiempo>15:00</tiempo> </punto> <punto> <x>0</x> <y>20</y> <tiempo>15:05</tiempo> </punto> <punto> <x>0</x> <y>100</y> <tiempo>15:10</tiempo> </punto> </trayectoria>'), XMLTYPE('<trayectoria> <punto> <x>30</x> <y>30</y> <tiempo>6:29</tiempo> </punto> <punto> <x>80</x> <y>60</y> <tiempo>6:48</tiempo> </punto> <punto> <x>50</x> <y>80</y> <tiempo>6:49</tiempo> </punto> <punto> <x>40</x> <y>100</y> <tiempo>6:55</tiempo> </punto> <punto> <x>20</x> <y>100</y> <tiempo>7:02</tiempo> </punto> </trayectoria>') ) ); INSERT INTO historial_visitante VALUES( 3, nest_docsXML( XMLTYPE('<trayectoria> <punto> <x>60</x> <y>40</y> <tiempo>23:11</tiempo> </punto> <punto> <x>60</x> <y>20</y> <tiempo>23:17</tiempo> </punto> <punto> <x>70</x> <y>10</y> <tiempo>23:29</tiempo> </punto> <punto> <x>80</x> <y>20</y> <tiempo>23:39</tiempo> </punto> <punto> <x>100</x> <y>30</y> <tiempo>23:43</tiempo> </punto> <punto> <x>90</x> <y>40</y> <tiempo>23:47</tiempo> </punto> <punto> <x>100</x> <y>60</y> <tiempo>23:54</tiempo> </punto> </trayectoria>') , XMLTYPE('<trayectoria> <punto> <x>10</x> <y>100</y> <tiempo>11:29</tiempo> </punto> <punto> <x>50</x> <y>80</y> <tiempo>11:48</tiempo> </punto> <punto> <x>90</x> <y>90</y> <tiempo>12:49</tiempo> </punto> </trayectoria>') ) ); La siguiente figura corresponde al mapa del centro comercial definida en la tabla “local” y las líneas corresponden a las trayectorias de la tabla “historial_visitante” donde cada una de las líneas está compuesta por los puntos indicados en el documento XML y corresponde a la posición de cada visitante en el tiempo indicado. Entre punto y punto (puntos contiguos temporalmente) de una trayectoria se traza una línea recta. 1) (Triggers). El centro comercial está delimitado por los puntos (0, 0) y (100, 100). Tener en cuenta: Categoría promedio: promedio de las categorías de todos los locales visitados por una misma trayectoria. Si se visita más de una vez un mismo local, por ejemplo, el local con id 5, solo se tiene en cuenta una vez para el cálculo del promedio. Pasar por un local: implica atravesarlo, no pasar por alguno de sus bordes. Es necesario que la trayectoria del visitante atraviese el local para asegurar que ingresó a este. Se debe controlar que: - - - (10%) Las trayectorias de un mismo visitante sean disjuntas en el tiempo, por ejemplo, el visitante 1 tiene una trayectoria que ocurrió entre las 8 y las 8:35, entonces ninguna otra de sus trayectorias puede tener un punto entre las 8 y las 8:35. Suponga que los tiempos de cada trayectoria ya vienen ordenados ascendentemente. (15%) Como se observa en el ejemplo presentado, ES VÁLIDO QUE UNA TRAYECTORIA PASE (ingrese y salga por cualquier parte del local) por uno o más tipos de locales. Sin embargo, una trayectoria puede como máximo pasar por 3 tipos distintos de locales (una trayectoria puede pasar varias veces por un mismo local). (15%) Cada local tiene una categoría. Sin embargo, la categoría promedio de los locales pasados por una trayectoria no debe ser inferior a 3. 2) (10%) Desarrolle un programa en Java que grafique el mapa correspondiente a la ciudad con sus respectivos locales, coloreando cada tipo de local con un color diferente. (En clase se explicó la conexión entre Java y Oracle y como dibujar líneas y figuras). 3) El programa en Java debe tener opciones que permitan: a) (10%) El usuario ingresa una identificación de un visitante y se deben graficar solo las trayectorias del visitante ingresado. Se debe mostrar cada trayectoria con su respectiva categoría promedio (si la trayectoria no pasó por ningún local, su promedio predeterminada es cero). b) (15%) El usuario ingresa un número n y se deben mostrar las n trayectorias con mayor categoría promedio. c) (15%) Imprimir la pareja de trayectorias que más tipos de locales (B01, R01, T01, T02, L01) visitaron en común. d) (10%) Suponga que usted tiene trayectorias como las mostradas en este trabajo. Plantee cuatro problemas, tan sencillos o tan complejos como desee, que se podrían plantear sobre trayectorias, por ejemplo, encontrar las dos trayectorias que son más similares en forma, encontrar las tres trayectorias más cortas que han recorrido todos los locales, etc. Implemente en Java la solución solo a uno de sus cuatro problemas, el que usted desee. Notas adicionales Puede manejar la escala como desee de tal forma que los objetos sean visibles. Mientras cumpla con las condiciones solicitadas, puede hacer todas las suposiciones que desee. Nota: Sus soluciones deben funcionar para cualquier cantidad de filas que tengan las tablas: existen muchos locales, muchos visitantes cada uno con muchas trayectorias. Los datos presentados son solo para efectos de ejemplificación. No modifique la estructura de las tablas dadas: no cambie los nombres ni les adicione ni les quite columnas. No hay necesidad de verificar la estructura de los documentos XML, se garantiza que estos cumplirán la estructura dada en los ejemplos. Puede usar todas las estructuras de datos y todas las tablas auxiliares que desee. Puede usar todas las funciones que des ee del API de XML de Oracle. Puede usar XPath, XQuery y todas las librerías de Java que desee. Para entregar impreso y por email a [email protected], el viernes 30 de Octubre al inicio de clase. No se reciben trabajos en hora posterior. No se reciben versiones “mejoradas”. Para la parte impresa solo se debe imprimir un informe donde se describa cómo se solucionó cada punto. No imprimir el código. Por email SÍ se debe enviar todo el código. Grupos máximo de tres personas. Los trabajos deben ser independientes entre los grupos. Trabajos copiados así sea en un SOLO punto se califican con 0 (cero) en su totalidad para todos los integrantes. Las soluciones presentadas deben ser originales, concebidas por cada grupo, no copiadas de medios como páginas web, foros, librerías de programas existentes, etc. El trabajo debe ser desarrollado por los integrantes del grupo no por personas ajenas a él. Cualquier duda consultarla personalmente o por email con el profesor. Los monitores les pueden ayudar con aspectos técnicos pero su función no es hacerles la práctica ni está autorizado para cambiarles las condiciones del trabajo. F. Moreno Octubre 6 de 2015.