<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>dottoNetto &#187; Bases de datos</title>
	<atom:link href="http://dottonetto.com/home/category/bases-de-datos/feed/" rel="self" type="application/rss+xml" />
	<link>http://dottonetto.com/home</link>
	<description>Programación, tecnología y un poco de todo</description>
	<lastBuildDate>Thu, 07 Mar 2013 10:40:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Planificación: el paquete data.dict</title>
		<link>http://dottonetto.com/home/2010/11/planificacion-el-paquete-data-dict/</link>
		<comments>http://dottonetto.com/home/2010/11/planificacion-el-paquete-data-dict/#comments</comments>
		<pubDate>Sat, 20 Nov 2010 18:22:00 +0000</pubDate>
		<dc:creator>ajaest</dc:creator>
				<category><![CDATA[Bases de datos]]></category>
		<category><![CDATA[JavaDiKt]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[campo]]></category>
		<category><![CDATA[clase]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[diccionario]]></category>
		<category><![CDATA[expresión]]></category>
		<category><![CDATA[interfaz]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[kanji]]></category>
		<category><![CDATA[Neodatis]]></category>
		<category><![CDATA[objeto]]></category>
		<category><![CDATA[paquete]]></category>
		<category><![CDATA[planificación]]></category>
		<category><![CDATA[problemas]]></category>

		<guid isPermaLink="false">http://ajaest.net/home/?p=414</guid>
		<description><![CDATA[Seguimos nuestro análisis de JavaDiKt con una introspección dentro de otro de los paquetes importante del paquete data: el paquete data.dict.]]></description>
			<content:encoded><![CDATA[<p>La <a title="ajaest.net" href="http://ajaest.net/home/2010/10/planificacion-el-paquete-data-kanji-iii-decisiones-de-diseno/" target="_self">pasada semana</a> terminamos(al fin!) con la serie sobre el paquete data.kanji, esta semana seguimos nuestro análisis de JavaDiKt con una introspección dentro de otro de los paquetes importante del paquete data: el paquete <code>data.dict</code>.</p>
<p>En un principio, el proyecto que iba a presentar al concurso no era <em>JavaDiKt</em>, sino otro llamado <em>Javadict</em>. Javadict (con &#8220;c&#8221;, y no con &#8220;k&#8221; de &#8220;kanji&#8221;) iba a ser una librería/API de propósito general para construir diccionarios de cualquier tipo de manera rápida y sencilla en Java. Iba a proveer de una serie de clases para modelar los contenidos (como podrían haber sido las clases &#8220;<code>Verb</code>&#8221; o &#8220;<code>Adverb</code>&#8220;) con sus respectivos mecanismos de almacenaje y recuperación. Era un proceso ambicioso, quizás más que el actual, pero al final decidí hacer algo más práctico y dejé el proyecto en el tintero para el futuro. El caso es que de esta idea surgió JavaDiKt y decidí usar algunas cosas que tenía en mente sobre el proyecto anterior en éste. Así, me propuse elaborar en una pequeña biblioteca independiente del resto del programa que contuviese todo lo necesario para la recuperación de los datos. Ese paquete acabaría siendo el actual paquete <code>data</code>.</p>
<p>En el paquete <code>data</code>, el modelado de datos está implementado en <code>data.kanji</code>, del que hemos hablado las semanas anteriores, mientras que las funciones que permiten consultas estás contenidas en <code>data.dict</code>:</p>
<div class="wp-caption aligncenter" style="width: 321px"><a href="https://forja.rediris.es/docman/view.php/818/1159/data.kanji%20detail%20v1.5.3.png" target="_blank"><img class="      " title="_data_Final diagram_v1.5.3" src="https://forja.rediris.es/docman/view.php/818/1159/data.kanji%20detail%20v1.5.3.png" alt="Copyrigth Luis A. Arce" width="311" height="247" /></a><p class="wp-caption-text">Paquete data, data.dict está a la derecha. Haz click para verlo más grande.</p></div>
<p>Como podemos ver en el diagrama, el paquete se divide a todas sus clases en el mismo paquete <code>data.dict</code> y en el subpaquete <code>data.query</code>.</p>
<p>La clase <code>KanjiDatabaseManager</code>, que extiende de <code>DatabaseManager</code>, es una clase que hace de <strong>interfaz</strong> entre la base de datos y la clase <code>KanjiDict</code>, que es la interfaz de más nivel que recubre a todas las posibles interfaces dedicadas a la consulta. <code>KanjiDict</code>, cuando recibe una consulta, resuelve a que base de datos debe hacerla(aunque de momento solo hay una base de datos, representada por <code>NeodatisKanjiDatabaseManager</code>, pero es probable que en el futuro haya más)  y realiza todos los cálculos necesarios sobre los datos extraídos antes de devolverlos. <code>NeodatisKanjiDatabaseManager</code> traduce las consultas de KanjiDict al lenguaje de la base de datos ( en este caso, <em>Neodatis ODB</em>) y realiza el trabajo sucio extrayéndolos para servirlos devolverlos de nuevo a <code>KanjiDict</code>.</p>
<p>El caso es que al implementar <code>NeodatisKanjiDatabaseManager</code> de <code><em>DatabaseManager</em></code>, KanjiDict puede usar la interfaz genérica de <code><em>DatabaseManager</em></code> para acceder a los datos, lo que permitirá, llegado el día, cambiar fácilmente de base datos simplemente implementando una nueva instancia de <code><em>DatabaseManager</em></code>, como pudiera ser, por ejemplo, <code>MySQLDatabaseManager</code>, <code>SQLiteDatabaseManager</code> o <code>XMLDatabaseManager</code>.</p>
<p>Por otro lado el paquete <code>data.dict.query</code> conforma mediante sus clases el mecanismo de elaboración de consultas y queries. En este paquete se diferencian 3 clases principales: la clase <code>KanjiQuery</code>, la clase <code>ValueQAbout</code> y la clase <code>KanjiExpression</code>. Estas tres clases representan las 3 de las 4 fases de las que está compuesta la elaboración de una query simple en lenguaje natural, que son:</p>
<ol>
<li><strong>Selección</strong>: elegir el tipo de <strong>dato que se quiere recuperar</strong>. En el caso de JavaDiKt, el dato a recuperar será siempre &#8220;Kanji&#8221;, por lo tanto no existen clases que modelen este comportamiento, todas las queries empezarán directamente en la siguiente fase. En SQL vendría dado por el comando SELECT.</li>
<li><strong>Exclusión</strong>: En este conjunto de fases distinguimos entre los <strong>elementos que queremos seleccionar</strong> y los que no. En SQL el comienzo de estas fases vendría dado por la expresión WHERE. En data.dict.query, este proceso comienza creando una nueva instancia de la clase <code>KanjiQuery</code>.
<ol>
<li><strong>Atribución</strong>: en esta fase determinamos <strong>para que atributos del tipo de datos especificado en la fase de selección queremos establecer una condición</strong>. En <code>data.dict.query</code>, el proceso seguiría al llamar desde la instancia creada anteriormente de <code>KanjiQuery</code> al método con el nombre del atributo del cual queremos hacer la atribución, lo cual nos devolvería un objeto de tipo <code>ValueQAbout</code> que representa los tipos posibles de condicionamientos posibles que pueden hacerse sobre dicho atributo</li>
<li><strong>Condicionamiento</strong>: a continuación, definimos la <strong>condición que ha de cumplir la atribución anterior</strong> para que las instancias del tipo de dato elegido en la primera fase sean devueltos. En <code>data.dict.query</code>, elegiríamos del objeto <code>ValueQAbout</code> obtenido en la fase anterior el tipo del condicionamiento que queremos aplicar sobre el atributo al que se refiere, obteniendo un objeto de tipo <code>KanjiExpression</code>. Llegados a este punto, <code>KanjiExpression</code> conforma ya una <strong>expresión válida y bien formada</strong> que describe un kanji o conjunto de kanjis, y puede ser usada para hacer consultas a la base de datos (podemos ver que el método <code>executeQuery()</code> de <code>Kanjidict</code> tiene como único argumento este tipo de datos). Sin embargo, si parásemos aquí, solo podríamos hacer exclusiones basándonos en un único atributo, razón por la que existe una fase opcional.</li>
<li><strong>Sobrexclusión</strong>: en esta fase, <strong>iniciamos una nueva etapa de exclusión</strong> que podrá que impondrá nuevas restricciones sobre el tipo de dato elegido. En <code>data.dict.query</code>, la clase <code>KanjiExpression</code> provee de los métodos <code>AND()</code> y <code>OR()</code> que permiten iniciar de nuevo el proceso devolviendo un nuevo método <code>KanjiQuery</code>. La expresión no volverá a ser válida y a estar bien formada hasta que del proceso se vuelva a obtener un nuevo método <code>KanjiExpression</code>.</li>
</ol>
</li>
</ol>
<p>Después de esto, creo que ayudará ver varios ejemplos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Busca los kanjis cuyo código unicode sea 0x4FFF o 0x4FF1</span>
KanjiExpression unicodeQuery = <span style="color: #000000; font-weight: bold;">new</span> KanjiQuery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">unicode_value</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equalz</span><span style="color: #009900;">&#40;</span>0x4FFF<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">OR</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">unicode_value</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equalz</span><span style="color: #009900;">&#40;</span>0x4FF1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Busca los kanjis con número de trazos entre 3 y 5inclusive</span>
KanjiExpression strokeQuery = <span style="color: #000000; font-weight: bold;">new</span> KanjiQuery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">stroke_count</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">greatherThan</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #666666; font-style: italic;">//Puede hacerse también en varios pasos</span>
strokeQuery = strokeQuery.<span style="color: #006633;">AND</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">stroke_count</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equalsOrLessThan</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Ahora para ejecutar la query tendríamos que hacer:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>8
9
10
</pre></td><td class="code"><pre class="java5" style="font-family:monospace;">KanjiDict kanjiDB<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003399; font-weight: bold;">Set</span><span style="color: #339933;">&lt;</span>KanjiTag<span style="color: #339933;">&gt;</span> retrievedKanjis = kanjiDB.<span style="color: #006633;">executeQuery</span><span style="color: #009900;">&#40;</span>strokeQuery<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Dos últimas anotaciónes. La primera, quizás os habéis percatado que su utiliza una clase distinta para cada valor de <code>ValueQAbout</code> relacionado con una propiedad de cada kanji cuando eso no es realmente necesario. Podría haberse usado un <code>ValueQAbout</code> genérico con un campo que definiese a que propiedad del Kanji se refiere y evitar así la multiplicidad de clases. Sin embargo, lo hice de esta manera porque pienso que en futuro se podrán refinar las clases en función de las características de cada propiedad. Por ejemplo, podría definirse para <code>KanjiGraphQAbout</code> un nuevo tipo de condicionamiento que sea, por ejemplo, &#8220;<em>se parece a</em>&#8221; o &#8220;<em>tiene el radical x</em>&#8220;.<br />
La segunda, es referente a aquellas propiedades del kanji que tienen más de un valor, como por ejemplo la variante, el código JIS o el significado. Veamos un trozo de código:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="java5" style="font-family:monospace;">KanjiExpression ke1 = <span style="color: #000000; font-weight: bold;">new</span> KanjiQuery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">dictionary_name</span>.<span style="color: #006633;">equalz</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;gakken&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
KanjiExpression ke2 = <span style="color: #000000; font-weight: bold;">new</span> KanjiQuery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">dictionary_reference</span>.<span style="color: #006633;">equalz</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;234&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
KanjiExpression ke3 = <span style="color: #000000; font-weight: bold;">new</span> KanjiQuery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">dictionary_name</span>.<span style="color: #006633;">equalz</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;gakken&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">AND</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">dictionary_reference</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equalz</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;234&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Lo que definen estas tres expresiones puede ser confuso, pero en realidad es muy simple. Al ejecutar la primera de ellas, la base de datos devolverá todos los kanjis que tienen una referencia en el diccionario <em>Gakken</em>, es decir, todos los kanjis que aparecen listados en dicho diccionario. La segunda, todos los kanjis que en cualquiera de los diccionarios tienen la referencia <em>234</em>. La tercera y última devolverá el kanji del diccionario Gakken que tiene la referencia <em>234</em>. Para este tipo de consultas es donde la sobreexclusión se hace imprescindible, otorgando al sistema de elaboración de queries gran poder.</p>
<p>Con esto terminamos por fin con la serie referente al paquete data kanji. En las próximas entradas empezaremos a hablar de la interfaz gráfica y los paquetes subyacentes.</p>
]]></content:encoded>
			<wfw:commentRss>http://dottonetto.com/home/2010/11/planificacion-el-paquete-data-dict/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Planificación: el paquete data.kanji II, la base de datos Neodatis</title>
		<link>http://dottonetto.com/home/2010/10/planificacion-el-paquete-data-kanji-ii-la-base-de-datos-neodatis/</link>
		<comments>http://dottonetto.com/home/2010/10/planificacion-el-paquete-data-kanji-ii-la-base-de-datos-neodatis/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 22:52:40 +0000</pubDate>
		<dc:creator>ajaest</dc:creator>
				<category><![CDATA[Bases de datos]]></category>
		<category><![CDATA[JavaDiKt]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[campo]]></category>
		<category><![CDATA[clase]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[kanji]]></category>
		<category><![CDATA[Neodatis]]></category>
		<category><![CDATA[objeto]]></category>
		<category><![CDATA[paquete]]></category>
		<category><![CDATA[planificación]]></category>
		<category><![CDATA[problemas]]></category>
		<category><![CDATA[query]]></category>
		<category><![CDATA[V concurso universitario de software libre]]></category>

		<guid isPermaLink="false">http://ajaest.net/home/?p=350</guid>
		<description><![CDATA[En esta entrada, hablaremos de la base de datos usada para almacenar los datos sobre kanjis, la base de datos de objetos Neodatis, lo cual nos servirá de prólogo para entrar de lleno en las motivaciones de diseño que han dado lugar a la organización actual del paquete data.kanji.]]></description>
			<content:encoded><![CDATA[<p>En la <a href="http://ajaest.net/home/2010/10/planificacion-el-paquete-data-kanji-i/">pasada entrada</a> hablamos sobre el paquete <code>data.kanji</code> e hicimos un esbozo general sobre como estaba organizado. En esta entrada, hablaremos de la base de datos usada para almacenar los datos sobre kanjis, la base de datos de objetos <strong>Neodatis</strong>, lo cual nos servirá de prólogo para entrar de lleno en las motivaciones de diseño que han dado lugar a la organización actual del paquete data.kanji.</p>
<p>Cuando empecé a pensar en como iba a hacer funcionar todo lo que había pensado para JavaDiKt, lo primero que pensé fue en como almacenar los datos de manera rápida, eficiente y sencilla. Lo primero que consideré fue en recuperar los datos sobre la marcha directamente desde un archivo <a title="wikipedia" href="http://es.wikipedia.org/wiki/Extensible_Markup_Language" target="_blank">XML</a>, pero pronto me di cuenta de que el acceso secuencial típico de este tipo de archivos significaba problemas a la hora de hacer búsquedas complejas como las que pretendía.</p>
<p>Después medite la posibilidad de usar alguna base de datos ligera tipo <a title="wikipedia" href="http://es.wikipedia.org/wiki/SQL" target="_self">SQL</a>, que pudiese incluirse dentro del mismo programa (es decir, que no necesitase un programa externo). Investigando encontré <a href="http://es.wikipedia.org/wiki/SQLite" target="_blank">SQLite</a>, y seguidamente un <a title="SQLiteJDBC" href="http://www.zentus.com/sqlitejdbc/" target="_blank">port</a> para Java. Esta era la solución idónea, pero para mi suponía un hándicap importantísimo, pues si lo que se sé de SQL es poco, lo que sé de modelado de datos SQL es aún menos, eso sin contar la batería de adaptadores y parseadores que tendría que desarrollar.</p>
<p>Estaba ya resignado a tener que empollarme un manual de SQL cuando por casualidad encontré bicheando por Internet algo llamado <a title="wikipedia" href="http://en.wikipedia.org/wiki/Object_database" target="_blank"><strong>bases de datos de objetos</strong></a>. Éstas se caracterizan por:</p>
<ul>
<li>Permiten<strong> almacenar y recuperar objetos de cualquier tipo siempre de manera íntegra</strong>, es decir, almacenas un objeto con todos sus atributos y lo recuperas en el mismo estado en el que fue almacenado.</li>
<li>La base de datos viene<strong> modelada según los tipos de clases a las que pertenecen los objetos que están almacenados en ella</strong>. Esto quiere decir, por ejemplo, que al almacenar un objeto crearas un nuevo tipo tabla con el nombre de su clase como nombre de la tabla y los atributos de dicha clase como dominios, añadiendo nuevos datos a esa tabla cada vez que añades un objeto de la misma clase.</li>
<li>Los <strong>objetos almacenados en otro objeto</strong> como campos o en contenedores <strong>formarán tablas</strong> nuevas en la base de datos, pudiendo realizar entonces consultas sobre estos objetos sin tener que referirse al objeto que los contenía.</li>
<li><strong>Cada query solo podrá contener expresiones referentes a un tipo de clase</strong>. Esto significa que solo podrá extraerse de la base de datos un tipo de objeto a la vez.</li>
<li>Cada base de datos es fuertemente dependiente del lenguaje para el que está diseñado y depende en gran medida de las propiedades de éste, como herencia, tipos, genéricos,&#8230;etc. Por tanto, las querys son construidas usando métodos, estilos y técnicas propias del lenguaje de programación elegido.</li>
</ul>
<p>Tengo que decir que me impresionó la sencillez y elegancia del invento, que solucionaba todos mis problemas. De una tacada me ahorraba tanto el modelado de datos usando el mismo modelado de clases del programa, como la construcción de adaptadores recuperando los objetos directamente de la base de datos.</p>
<p><img class="alignright" src="http://a1.twimg.com/profile_images/205590909/neodatis-twitter_bigger.png" alt="Copyright perteneciente a su respectivo autor" width="73" height="73" />Buscando entonces algo parecido para Java me topé con <a title="Neodatis Object Database" href="http://www.neodatis.org/" target="_blank">Neodatis</a>, una base de datos de este estilo y de software libre, con una documentación adecuada y un desarrollo lo suficientemente maduro, y decidí tras una serie de pruebas que era viable su uso.</p>
<p>Además de todo lo dicho anteriormente, Neodatis incluye además algunas características interesantes extras como la posibilidad de construir índices de un campo en concreto de una clase para acelerar las búsquedas de objetos, elaboración de queries muy intuitiva, elección de codificación, exportación/importación XML o una api de desarrollo de constructores de queries.</p>
<p>Sin embargo, <strong>Neodatis</strong> también presenta algunos problemas importantes.Después de las pruebas, he comprobado que:</p>
<ul>
<li>La mezcla de <strong>herencia y tipos</strong> genéricos en una misma clase genera <strong>problemas</strong> a la hora de recuperar objetos de dicha clase.</li>
<li>La única consulta posible sobre <strong>contenedores</strong> que sean campos de una clase es <strong>contains</strong>. Esto quiere decir que si, por ejemplo, tenemos una lista de <em>números</em> dentro de un objeto de tipo <em>grupo de números</em>, podremos recuperar todos los objetos de tipo <em>grupo de números</em> que contengan al número <em>5</em>, pero no a todos los que contengan números menores que <em>5</em>.<br />
Además para tipos como los mapas ni siquiera esto será posible</li>
<li>Todos los métodos de la base de datos <strong>usan técnicas de reflexión</strong> y consultas en tiempo de ejecución sobre los tipos de datos, lo que significa que no existe <strong>seguridad en los tipos</strong> en ningún momento.</li>
<li>Hasta donde he podido probar, no es posible acceder a la base de datos<strong> usando distintos hilos</strong>. Solo un proceso puede manejarla a la vez.</li>
<li>Las consultas sobre igualdad de objetos se basan en la igualdad de atributos entre las dos clases y no en el método <code>equals</code> de cada clase.</li>
</ul>
<p>Y con esto terminamos la entrada de hoy. En la <a title="ajaest.net" href="http://ajaest.net/home/2010/10/planificacion-el-paquete-data-kanji-iii-decisiones-de-diseno/" target="_self">próxima</a>, veremos como todos estos factores han sido fundamentales a la hora de definir la estructura del paquete <code>data.kanji</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dottonetto.com/home/2010/10/planificacion-el-paquete-data-kanji-ii-la-base-de-datos-neodatis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
