svn-gvsig-desktop / tags / v1_1_Build_1004 / libraries / libGDBMS / docs / gdbms.html @ 41849
History | View | Annotate | Download (9.85 KB)
1 | 1956 | fjp | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
---|---|---|---|
2 | <HTML>
|
||
3 | <HEAD>
|
||
4 | <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=iso-8859-1"> |
||
5 | <TITLE></TITLE> |
||
6 | <META NAME="GENERATOR" CONTENT="OpenOffice.org 1.1.1 (Linux)"> |
||
7 | <META NAME="CREATED" CONTENT="20050304;9024500"> |
||
8 | <META NAME="CHANGED" CONTENT="20050323;16380400"> |
||
9 | <STYLE>
|
||
10 | <!--
|
||
11 | @page { size: 21.59cm 27.94cm }
|
||
12 | -->
|
||
13 | </STYLE>
|
||
14 | </HEAD>
|
||
15 | <BODY LANG="es-ES" DIR="LTR"> |
||
16 | <P>GDBMS</P> |
||
17 | <OL>
|
||
18 | <LI><P STYLE="margin-bottom: 0cm">Introducción |
||
19 | </P>
|
||
20 | <LI><P STYLE="margin-bottom: 0cm">Parseado |
||
21 | </P>
|
||
22 | <LI><P STYLE="margin-bottom: 0cm">Extensibilidad |
||
23 | </P>
|
||
24 | </OL>
|
||
25 | <OL START=3> |
||
26 | <OL>
|
||
27 | <LI><P STYLE="margin-bottom: 0cm">Drivers</P> |
||
28 | <LI><P STYLE="margin-bottom: 0cm">Funciones</P> |
||
29 | <LI><P STYLE="margin-bottom: 0cm">Tipos |
||
30 | </P>
|
||
31 | </OL>
|
||
32 | </OL>
|
||
33 | <OL START=4> |
||
34 | <LI><P>Ejecución de consultas |
||
35 | </P>
|
||
36 | </OL>
|
||
37 | <P><BR><BR> |
||
38 | </P>
|
||
39 | <P><B>1.- Introducción</B></P> |
||
40 | <P>GDBMS es una librería de acceso a datos extensible que |
||
41 | permite la ejecución de un subconjunto del estándar SQL |
||
42 | sobre fuentes de datos heterogéneas. Esto quiere decir que se
|
||
43 | puede realizar una instrucción SQL que involucre tablas que
|
||
44 | residan en servidores de base de datos distintos, o incluso entre una |
||
45 | tabla de un servidor remoto y un fichero en local.</P>
|
||
46 | <P><B>2.- Procesado de instrucciones</B></P> |
||
47 | <P>Para ejecutar las instrucciones primero hay que analizarlas
|
||
48 | sintácticamente. Esto se realiza con la librería <A HREF="https://javacc.dev.java.net/">javacc</A> |
||
49 | usando la gramática <A HREF="sql.html">sql.html</A>, lo cual |
||
50 | nos genera un árbol sintáctico asociado a la |
||
51 | instrucción y es en esta primera fase donde se detectan los
|
||
52 | errores sintácticos.
|
||
53 | </P>
|
||
54 | <P>Una vez obtenido el árbol sintáctico, se obtiene un |
||
55 | arbol de adaptadores de forma paralela en la que cada nodo de dicho |
||
56 | árbol se basa en la información del nodo |
||
57 | correspondiente del árbol sintáctico para proporcionar |
||
58 | información de más alto nivel. Cada nodo del árbol |
||
59 | de adaptadores tiene un nodo correspondiente en el arbol sintáctico,
|
||
60 | sin embargo, no sucede al revés. Un nodo del árbol |
||
61 | sintáctico no tiene por qué tener una correspondencia |
||
62 | con un nodo del de adaptadores. Lo que quiere decir esto es que un |
||
63 | nodo adaptador puede representar un nodo sintáctico o un
|
||
64 | subárbol sintáctico. Durante la ejecución de las |
||
65 | instrucciones, se puede pedir información a dicho árbol |
||
66 | tal como el valor de una expresión para una determinada fila.
|
||
67 | En este caso, asociado a al nodo del árbol sintáctico |
||
68 | (nodo sintáctico desde ahora) que representa la expresión |
||
69 | habrá un nodo adaptador que en base a los valores de los nodos
|
||
70 | sintácticos devolverá el valor de la expresión |
||
71 | para la fila que se está evaluando.</P> |
||
72 | <P><B>3.- Extensibilidad</B></P> |
||
73 | <P>Hay varios puntos en los que se puede extender a gdbms</P> |
||
74 | <P STYLE="font-style: normal"><U>3.1.- Drivers</U></P> |
||
75 | <P>La fuente de datos sobre la que opera gdbms es un DataSource, que
|
||
76 | es una clase que proporciona acceso a los datos que representa y |
||
77 | permite algunas operaciones adicionales como acceder a los campos por |
||
78 | nombre, etc. Además existen DataSource que son producto de
|
||
79 | operaciones, es decir, una join entre dos DataSource es otro |
||
80 | DataSource. Las DataSouce's usan a los drivers para acceder a los |
||
81 | datos.</P>
|
||
82 | <P>Se pueden crear drivers para leer información de ficheros |
||
83 | de disco y para acceder a tablas de bases de datos. El acceso a estas |
||
84 | últimas se realiza mediante JDBC por lo que se puede acceder
|
||
85 | actualmente a cualquier sistema de base de datos para el cual exista |
||
86 | un driver JDBC.</P>
|
||
87 | <P>Para crear un DataSource en gdbms tenemos varias alternativas.
|
||
88 | Todas ellas vienen definidas por la clase DataSourceFactory, que |
||
89 | proporciona varios métodos para obtener los DataSource.
|
||
90 | </P>
|
||
91 | <P>Si la información se encuentra en un fichero o en una base |
||
92 | de datos podemos añadir la fuente de datos al sistema mediante
|
||
93 | las llamadas addXXXDataSource y luego obtener los DataSource asociado |
||
94 | mediante la llamada createRandomDataSource(String sql). De ésta
|
||
95 | última llamada, podemos deducir que las fuentes de datos de
|
||
96 | base de datos no tienen por qué corresponderse con una tabla
|
||
97 | completa y pueden ser una consulta sobre una tabla que recupere un |
||
98 | subconjunto de los campos y de los registros. Cabe destacar que en |
||
99 | estos métodos estamos indicando datos que definen la fuente de
|
||
100 | datos (ubicación del fichero, nombres de las columnas, etc...)
|
||
101 | por lo que si se cambia esta información seguramente no se
|
||
102 | podrá obtener un DataSource asociado al origen de los datos.</P> |
||
103 | <P>Además de los drivers de fichero y de base de datos, |
||
104 | existen unas interfaces que al ser implementadas permiten a la |
||
105 | factoría crear DataSource. Esto es fundamental para integrar
|
||
106 | gdbms en otros sistemas como por ejemplo gvSIG, en la que hay objetos |
||
107 | que han leido la información alfanumérica y se quiere |
||
108 | obtener un DataSource que acceda a estos datos.</P>
|
||
109 | <P>Si la información se encuentra en un objeto que ya contiene |
||
110 | la información por estar en un framework de otro sistema y
|
||
111 | simplemente se quiere tener un DataSource con la información
|
||
112 | de dicho objeto, se deberá usar la llamada
|
||
113 | addDataSource(ReadDriver rd, String dataSourceName) y que dicho |
||
114 | objeto implemente la interfaz ReadDriver.</P>
|
||
115 | <P><U>3.2.- Funciones</U></P> |
||
116 | <P><U>3.3.- Tipos</U></P> |
||
117 | <P><B>4.- Ejecución de consultas</B></P> |
||
118 | <P STYLE="font-weight: medium">La ejecución de una instrucción |
||
119 | SQL puede ser delegada en un servidor de base de datos, con el ahorro |
||
120 | temporal de la ejecución, si los DataSource's implicados
|
||
121 | cumple que son del mismo servidor y son accedidas con el mismo |
||
122 | usuario y password y están registrados de una determinada
|
||
123 | manera. En caso de encontrarse una SQL que cumpla la condición
|
||
124 | anterior se deberá de sustituir los nombres de los datasource
|
||
125 | por los nombres de las tablas a las que acceden y al final de la |
||
126 | cláusula where habría que añadir con AND las |
||
127 | condiciones where de los datasource. Una vez realizado eso se podría
|
||
128 | delegar en el servidor dicha instrucción.</P> |
||
129 | <P STYLE="font-weight: medium">Las condiciones para delegar la |
||
130 | ejecución en el servidor son:</P> |
||
131 | <UL>
|
||
132 | <LI><P STYLE="font-weight: medium">Que las tablas residan en el |
||
133 | mismo servidor.</P>
|
||
134 | <LI><P STYLE="font-weight: medium">Que sean accedidas por el mismo |
||
135 | usuario, porque de lo contrario el resultado podría tener
|
||
136 | datos que no fueran visibles completamente por ninguno de los |
||
137 | usuarios de la base de datos</P>
|
||
138 | <LI><P><SPAN STYLE="font-weight: medium">Que estén |
||
139 | registradas mediante el método addDBDataSource en el que se
|
||
140 | le especifica la tabla, la clausula where. Esto limita el conjunto |
||
141 | de consultas SQL que se pueden delegar en el servidor ya que la |
||
142 | complejidad se reduce significativamente. Hay que realizar un |
||
143 | proceso de traducción de nombres de gdbms a los nombres
|
||
144 | propios del sistema donde se va a delegar la instrucción
|
||
145 | además de añadir la cláusula where de las |
||
146 | tablas implicadas, etc, ...</SPAN></P> |
||
147 | </UL>
|
||
148 | <P STYLE="font-weight: medium">Por otro lado cabe resaltar varios |
||
149 | inconvenientes que presenta el hecho de que se delegue en el servidor |
||
150 | la ejecución. El primero es que las referencias a campos de la
|
||
151 | tabla deben ser cualificadas, ya que de lo contrario se debería
|
||
152 | de hacer peticiones adicionales al servidor con la finalidad de saber |
||
153 | a qué tabla pertenece cada campo. El segundo es el coste
|
||
154 | temporal de ejecutar una consulta sobre varias tablas sin que ésta
|
||
155 | se delegue en el servidor. Por una parte hay que traerse del servidor |
||
156 | las tablas implicadas que no tiene por qué estar en la máquina |
||
157 | local (de hecho es lógico que no sea así) y por la |
||
158 | otra, una vez los datos han sido descargados se deberá de
|
||
159 | realizar la operación en Java que no destaca por la velocidad
|
||
160 | de ejecución. Es por esto que si se quiere realizar una
|
||
161 | operación con tablas que residan en el mismo servidor,
|
||
162 | conviene añadir una nueva fuente de datos indicando la
|
||
163 | consulta SQL que la define. De esta manera nos aseguramos de que la |
||
164 | ejecución se realiza en el servidor.</P> |
||
165 | <P STYLE="font-weight: medium">En caso de que no se pueda delegar la |
||
166 | ejecución en ningún servidor el resultado se computa en |
||
167 | el núcleo de gdbms mediante una serie de decoradores que se
|
||
168 | ponen sobre los DataSouce's involucrados en la instrucción.
|
||
169 | Estos decoradores implementan la interfaz DataSouce por lo que el |
||
170 | resultado de la operación es también un DataSouce. Para |
||
171 | una ejecución más eficiente se simplifica el arbol de |
||
172 | adaptadores. Durante la ejecución de una instrucción, |
||
173 | se procesa el subárbol de expresiones múltiples veces |
||
174 | para evaluarla, es por esto que la simplificación de este
|
||
175 | árbol aporta una aceleración del procesado de las |
||
176 | instrucciones. Para simplificar el árbol el proceso realizado
|
||
177 | consiste en recorrer el subárbol de expresiones y para cada
|
||
178 | expresión que sólo tenga como hijo una subexpresión |
||
179 | y no realice ninguna operación sobre el resultado de la
|
||
180 | expresión anterior, se hace un bypass del padre a ese único |
||
181 | hijo, eliminándose el nodo en proceso. Los nodos susceptibles
|
||
182 | de desaparecer son los siguientes:</P>
|
||
183 | <UL>
|
||
184 | <LI><P STYLE="font-weight: medium">AndExpr</P> |
||
185 | <LI><P STYLE="font-weight: medium">NotExpr</P> |
||
186 | <LI><P STYLE="font-weight: medium">OrExpr</P> |
||
187 | <LI><P STYLE="font-weight: medium">ProductExpr</P> |
||
188 | <LI><P STYLE="font-weight: medium">SumExpr</P> |
||
189 | <LI><P STYLE="font-weight: medium">Term</P> |
||
190 | </UL>
|
||
191 | </BODY>
|
||
192 | </HTML> |