<?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>Bosque Viejo &#187; Base de Datos</title>
	<atom:link href="http://bosqueviejo.net/category/db/feed/" rel="self" type="application/rss+xml" />
	<link>http://bosqueviejo.net</link>
	<description>Sitio web sobre programación, software libre, redes, servidores, ofimática... y todo lo relacionado con la informática que nos rodea</description>
	<lastBuildDate>Sun, 22 Jan 2012 01:02:42 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>NewSQL: dos vías para mejorar SQL</title>
		<link>http://bosqueviejo.net/2011/12/20/newsql-dos-vias-para-mejorar-sql/</link>
		<comments>http://bosqueviejo.net/2011/12/20/newsql-dos-vias-para-mejorar-sql/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 14:40:30 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[jdb]]></category>
		<category><![CDATA[newsql]]></category>
		<category><![CDATA[s2]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1171</guid>
		<description><![CDATA[ Últimamente hay muchos medios (como SDJournal) que van haciendo eco de una nueva versión, según algunos más fácil, de SQL.
Según vemos en la página oficial del proyecto, NewSQL dispone a día de hoy de dos posibles gramáticas a implementar. Una de ellas está basada en la Java Database (JDB) y otra sería la evolución propia de SQL (SQL II, o S2). Aún no se ha decidido qué versión será la empleada como newSQL, por lo que, podemos decir que es un proyecto a futuro y no hay implementación real de momento.
Implementación JDB
La sintaxis que se desea implementar al estilo JDB tendría esta forma en comparación con el SQL actual:


SQL
NewSQL JDB



CREATE TABLE TEST (
&#160;&#160;ID INT PRIMARY KEY,
&#160;&#160;NAME VARCHAR(255)
)


test = new table(
&#160;&#160;int id,
&#160;&#160;string name,
&#160;&#160;key(id)
)



INSERT INTO TEST VALUES(1, &#8216;Hello&#8217;)
test.add(1, &#8216;Hello&#8217;)


SELECT * FROM TEST
test.get()


SELECT T1.ID, T2.NAME FROM TEST T1, TEST T2 WHERE T.ID = T2.ID
t1 = test; t2 = test; t1.join(t2[t1.id==t2.id]).get(t1.id, t2.name)


UPDATE TEST SET NAME=&#8217;Hi&#8217; WHERE ID=1
test[id==1].set(name=&#8217;Hi&#8217;)


DELETE FROM TEST WHERE ID=1
test[id==1].delete()


DROP TABLE TEST
test.drop()


La sintaxis puede parecer bastante clara y limpia, sobre todo para los que programan con lenguajes del estilo de Java, C++, PHP y de sintaxis derivada. No obstante, si tenemos en cuenta que esto sustituye a SQL, pero no a la [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/sql-150x150.jpg" alt="" title="sql" width="150" height="150" class="alignleft size-thumbnail wp-image-1172" /> Últimamente hay muchos medios (como <a href="http://en.sdjournal.org/software-developers-journal-511-5/">SDJournal</a>) que van haciendo eco de una nueva versión, según algunos más fácil, de SQL.</p>
<p>Según vemos en la <a href="http://newsql.sourceforge.net/">página oficial</a> del proyecto, NewSQL dispone a día de hoy de dos posibles gramáticas a implementar. Una de ellas está basada en la <em>Java Database</em> (JDB) y otra sería la evolución propia de SQL (SQL II, o S2). Aún no se ha decidido qué versión será la empleada como newSQL, por lo que, podemos decir que es un proyecto a futuro y no hay implementación real de momento.</p>
<h3>Implementación JDB</h3>
<p>La sintaxis que se desea implementar al estilo JDB tendría esta forma en comparación con el SQL actual:</p>
<table>
<tr>
<th>SQL</th>
<th>NewSQL JDB</th>
</tr>
<tr>
<td>
CREATE TABLE TEST (<br />
&nbsp;&nbsp;ID INT PRIMARY KEY,<br />
&nbsp;&nbsp;NAME VARCHAR(255)<br />
)
</td>
<td>
test = new table(<br />
&nbsp;&nbsp;int id,<br />
&nbsp;&nbsp;string name,<br />
&nbsp;&nbsp;key(id)<br />
)
</td>
</tr>
<tr>
<td>INSERT INTO TEST VALUES(1, &#8216;Hello&#8217;)</td>
<td>test.add(1, &#8216;Hello&#8217;)</td>
</tr>
<tr>
<td>SELECT * FROM TEST</td>
<td>test.get()</td>
</tr>
<tr>
<td>SELECT T1.ID, T2.NAME FROM TEST T1, TEST T2 WHERE T.ID = T2.ID</td>
<td>t1 = test; t2 = test; t1.join(t2[t1.id==t2.id]).get(t1.id, t2.name)</td>
</tr>
<tr>
<td>UPDATE TEST SET NAME=&#8217;Hi&#8217; WHERE ID=1</td>
<td>test[id==1].set(name=&#8217;Hi&#8217;)</td>
</tr>
<tr>
<td>DELETE FROM TEST WHERE ID=1</td>
<td>test[id==1].delete()</td>
</tr>
<tr>
<td>DROP TABLE TEST</td>
<td>test.drop()</td>
</tr>
</table>
<p>La sintaxis puede parecer bastante clara y limpia, sobre todo para los que programan con lenguajes del estilo de Java, C++, PHP y de sintaxis derivada. No obstante, si tenemos en cuenta que esto sustituye a SQL, pero no a la forma de enviar las consultas, generar una cadena de texto de este estilo para enviarla al Sistema Gestor de Base de Datos, puede resultar bastante tedioso igualmente.</p>
<p>Hay bastantes dudas sobre, por ejemplo el INSERT, ya que, ahí nos muestran una inserción completa, pero, ¿y si queremos que haya datos por defecto y solo declarar algunos? &#8230; igualmente, en la cadena de búsqueda, da la sensación de haber empleado XPath para seleccionar las tuplas&#8230; ¿cómo se haría si se busca por un criterio en lugar de un ID? &#8230; al final puede quedar algo difícil de entender, realmente.</p>
<h3>SQL II (S2)</h3>
<p>La otra opción, es una versión evolucionada de SQL (o simplificada, según se mire), que tiene la siguiente forma:</p>
<table>
<tr>
<th>SQL</th>
<th>NewSQL JDB</th>
</tr>
<tr>
<td>
CREATE TABLE TEST (<br />
&nbsp;&nbsp;ID INT PRIMARY KEY,<br />
&nbsp;&nbsp;NAME VARCHAR(255)<br />
)
</td>
<td>
create table test (<br />
&nbsp;&nbsp;id int;<br />
&nbsp;&nbsp;name string;<br />
&nbsp;&nbsp;primary key(id)<br />
)
</td>
</tr>
<tr>
<td>INSERT INTO TEST VALUES(1, &#8216;Hello&#8217;)</td>
<td>insert test (1, &#8216;Hello&#8217;)</td>
</tr>
<tr>
<td>SELECT * FROM TEST</td>
<td>select test</td>
</tr>
<tr>
<td>SELECT T1.ID, T2.NAME FROM TEST T1, TEST T2 WHERE T.ID = T2.ID</td>
<td>select t1:test join t2:test on t1.id == t2.id get t1.id, t2.name</td>
</tr>
<tr>
<td>UPDATE TEST SET NAME=&#8217;Hi&#8217; WHERE ID=1</td>
<td>update test set id=1 where name==&#8217;Hi&#8217;</td>
</tr>
<tr>
<td>DELETE FROM TEST WHERE ID=1</td>
<td>delete test where id==1</td>
</tr>
<tr>
<td>DROP TABLE TEST</td>
<td>drop test</td>
</tr>
</table>
<p>Revisándolo, se ve claro que no aporta mucho, realmente, a lo que se usa de hoy en día. Es más, se intenta introducir de forma fija el uso del operador &#8220;==&#8221; en lugar de &#8220;=&#8221;, lo cual resulta extraño e inapropiado, desde mi punto de vista, ya que, en todo caso, cambiaría mejor el &#8220;=&#8221; del UPDATE por un &#8220;&lt;-&#8221;.</p>
<h3>Conclusiones</h3>
<p>Desde mi punto de vista, más que centrarse en cómo escribir &#8220;mejor&#8221; los sistemas SQL, deberían de centrarse en agregar dichas sentencias para que se mezclasen con el código, algo como <a href="http://es.wikipedia.org/wiki/SQLJ">SQLJ</a>, de cara a integración con los lenguajes, y de cara al mejor uso de SQL, hacer estándares del uso de las fechas (que cada sistema los usa a su forma), así como los LIMIT, funciones básicas y tipos de datos, entre otras muchas cosas, para que los SGBD fuesen más compatibles entre ellos.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/12/20/newsql-dos-vias-para-mejorar-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>De MySQL a MariaDB</title>
		<link>http://bosqueviejo.net/2011/11/03/de-mysql-a-mariadb/</link>
		<comments>http://bosqueviejo.net/2011/11/03/de-mysql-a-mariadb/#comments</comments>
		<pubDate>Thu, 03 Nov 2011 02:07:49 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[administración de sistemas]]></category>
		<category><![CDATA[mariadb]]></category>
		<category><![CDATA[michael widenius]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1036</guid>
		<description><![CDATA[ O del delfín a la foca, o de lo privado a lo público, &#8230; mucho ha llovido desde que MySQL salió y, con su versión 3.23, recorrieran el mundo instalándose de los primeros en soportar la mayoría de sitios web en internet a través de la idea LAMP.
No obstante, la historia quiso que MySQL AB, la empresa que se creó para comercializar la idea de la base de datos rápida para webs, fuese finalmente adquirida por Sun Microsystems, para dar un supuesto impulso a su integración con el mundo de Java. A lo que respondió otro de los grandes del sector, finalmente, comprando a la propia Sun Microsystems.
En el momento en el que MySQL pasó a ser de Sun, comenzaron las tiranteces, de forma que, Monty, uno de los fundadores y responsable del desarrollo inicial de MySQL, que comentó que el nombre, precisamente, provenía de una de sus hijas (llamada My), hizo un fork, dándole el nombre de MariaDB (otra de sus hijas).
El caso es que, por ética profesional y propia, al final, he decidido abandonar definitivamente MySQL para usar única y exclusivamente MariaDB en lo que concierne a base de datos tipo MySQL&#8230; ya que, también hay otras [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/mysql2mariadb-150x150.jpg" alt="" title="mysql2mariadb" width="150" height="150" class="alignleft size-thumbnail wp-image-1037" /> O del delfín a la foca, o de lo privado a lo público, &#8230; mucho ha llovido desde que MySQL salió y, con su versión 3.23, recorrieran el mundo instalándose de los primeros en soportar la mayoría de sitios web en internet a través de la idea <a href="http://es.wikipedia.org/wiki/LAMP">LAMP</a>.</p>
<p>No obstante, la historia quiso que MySQL AB, la empresa que se creó para comercializar la idea de la base de datos rápida para webs, fuese finalmente <a href="http://www.elpais.com/articulo/internet/Sun/Microsystems/compra/MySQL/1000/millones/dolares/elpeputec/20080116elpepunet_8/Tes">adquirida por Sun Microsystems</a>, para dar un supuesto impulso a su integración con el mundo de Java. A lo que respondió otro de los grandes del sector, finalmente, <a href="http://www.elpais.com/articulo/internet/Oracle/adquiere/Sun/Microsystems/5710/millones/elpeputec/20090420elpepunet_3/Tes">comprando a la propia Sun Microsystems</a>.</p>
<p>En el momento en el que MySQL pasó a ser de Sun, comenzaron las tiranteces, de forma que, Monty, uno de los fundadores y responsable del desarrollo inicial de MySQL, que comentó que el nombre, precisamente, provenía de una de sus hijas (llamada My), hizo un <em>fork</em>, dándole el nombre de MariaDB (otra de sus hijas).</p>
<p>El caso es que, por ética profesional y propia, al final, he decidido abandonar definitivamente MySQL para usar única y exclusivamente MariaDB en lo que concierne a base de datos tipo MySQL&#8230; ya que, también hay otras como PostgreSQL que siguen siendo una muy buena opción a considerar, según el caso que se dé.</p>
<h3>Migrando</h3>
<p>Lo primero, veo que en la propia página de Monty dedicada a MariaDB, hay un <a href="http://downloads.askmonty.org/mariadb/repositories/">configurador</a> bastante bueno de elegir la distribución, la versión de MariaDB a instalar y el <em>mirror</em> más cercano. Con esto tenemos que la instalación en mi Debian Squeeze, por ejemplo, se basa en poner los repositorios correspondientes y hacer el <em>apt-get install</em> para <em>mariadb-server-5.3</em> (por ejemplo).</p>
<p>Tanto si se instala de forma automática, como de forma manual, si tenemos corriendo un MySQL 5.1 (por ejemplo), el sistema se encarga de desinstalarlo, poner en su lugar MariaDB y ejecutar un script llamado <em>mysql_upgrade</em> (que en caso de la instalación desde <em>apt-get install</em> se realizará de forma automática).</p>
<p>El servidor se levanta de forma rápida y tenemos un MySQL completamente funcional con la base de datos instalada y funcionando. El corte casi que ni se nota.</p>
<p>No obstante, <strong>siempre es deseable tener una copia de seguridad</strong> por lo que pudiera pasar. Está el caso de éxito de <a href="http://www.spamexperts.com/es/spam-experts/archivos-de-noticias/article/caso-de-estudio-rapida-y-eficiente-migracion-de-cientos-de-servidores-de-mysql-a-mariadb.html?no_cache=1&#038;cHash=4cc7dce457740135e0085f4f0926d505">SpamExperts</a> que migraron cerca de 300 servidores en más o menos tres horas y sin complicaciones.</p>
<h3>Las ramas de MariaDB</h3>
<p>Actualmente hay disponibles <a href="http://downloads.askmonty.org/mariadb/">tres ramas de MariaDB</a>, la versión 5.1, la versión 5.2 y la versión 5.3.</p>
<ul>
<li>La versión 5.1 es una versión prácticamente igual que la versión 5.1 de MySQL, solo que con muchas correcciones de errores realizadas.</li>
<li>La versión 5.2 es la siguiente evolución, que consta con muchas de las características que querrían haber introducido sus creadores en la versión anterior, pero no pudieron por falta de tiempo.</li>
<li>La versión 5.3 es la actual, que integra muchas mejoras y cosas que en MySQL solo están en la versión comercial.</li>
</ul>
<p>La versión 5.3, que es la última y la más avanzada, tiene cosas como:</p>
<ul>
<li><strong>Optimizaciones en subconsultas</strong>, de siempre en SQL, el hecho de realizar subconsultas es algo que da un poco de miedo, porque, además de que puede ser lioso el hecho de construir una gran consulta con subconsultas dentro, tiene penalización en rendimiento. Pues bien, esta versión está optimizada para el uso de subconsultas de modo que, con respecto a MySQL (la versión normal) mejora el rendimiento sustancialmente.</li>
<li><strong>Interfaz NoSQL</strong>&#8230; bueno, realmente, sigue siendo SQL, pero permite redefinir y aumentar la base de datos de forma fácil en cada UPDATE e INSERT. Un ejemplo puede verse <a href="http://blog.ygraphix.net/en/2011/05/24/un-peu-de-nosql-pour-mariadb/">en esta página</a>.</li>
<li><strong>Nuevos engines</strong> (realmente esto es de la <a href="http://kb.askmonty.org/en/what-is-mariadb-52">5.2</a>), permite usar <em>OQGRAPH</em>, que es un engine preparado para el almacenamiento de elementos jerárquicos y grafos; y <em>SphinxSE</em> que integra un sistema de búsqueda de texto muy parecida al FTS de PostgreSQL enlazando con el servidor de <a href="http://sphinxsearch.com/docs/current.html">Sphinx</a>.</li>
<li><strong>Autenticación por plugins</strong>: permite tener autenticación vía PAM, LDAP, etc.</li>
</ul>
<h3>Conclusiones</h3>
<p>MariaDB se mueve en un entorno ágil con mucha gente que lo mantiene desde su comunidad, y sobretodo, con el apoyo y liderazgo de quien comenzó en su día MySQL, por lo que, es más que posible que dentro de unos cuantos meses o años, se comience a escuchar hablar más de MariaDB que de MySQL. Además, migrar ahora es fácil, ya que las versiones 5.1 en ambos elementos son muy parecidos (son casi iguales), pero ya con la versión 5.5 de MySQL (han saltado de la 5.1 a la 5.5 directamente) y la 5.3 de MariaDB, cada vez se irán distanciando más.</p>
<p>Mi consejo: ¡actualiza ya!</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/11/03/de-mysql-a-mariadb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MongoDB: base de datos heterogénea</title>
		<link>http://bosqueviejo.net/2011/10/26/mongodb-base-datos-heterogenea/</link>
		<comments>http://bosqueviejo.net/2011/10/26/mongodb-base-datos-heterogenea/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 13:02:24 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1026</guid>
		<description><![CDATA[ Hace tiempo que tenía pendiente dar una vuelta a las base de datos NoSQL para mostrar un poco el cómo funcionan, qué se puede hacer con ellas y cómo se comportan en ciertas situaciones específicas.
En este caso, aunque he hablado en otras ocasiones de CouchDB, de Cassandra, etc. me ha llamado la atención MongoDB. Esta base de datos realizada en C++, que cuenta, entre sus principales características con ser una base de datos de esquema libre, de alto rendimiento y orientada a documentos.
Coincide que ayer se liberó la versión 2.0.1, aunque no comentaré las nuevas mejoras, sino en sí, lo que hace MongoDB.
Acceso a Datos
El sistema de MongoDB es de esquema libre. Esto quiere decir que no requiere de una definición previa de datos, es decir, de hecho, los datos que se almacenan en sus colecciones son heterogéneos completamente.
Mientras que una base de datos relacional, con tablas, se estructura en base de datos, tablas, tuplas y campos, una base de datos, como MongoDB, se estructura en base de datos, colección y datos. Esto quiere decir que, dentro de una colección podría poner el dato:

{ a: 1, b: 2, c: 3 }

Y acto seguido, agregar otro dato a la colección [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/mongodb-post-150x150.jpg" alt="" title="mongodb" width="150" height="150" class="alignleft size-thumbnail wp-image-1027" /> Hace tiempo que tenía pendiente dar una vuelta a las base de datos NoSQL para mostrar un poco el cómo funcionan, qué se puede hacer con ellas y cómo se comportan en ciertas situaciones específicas.</p>
<p>En este caso, aunque he hablado en otras ocasiones de CouchDB, de Cassandra, etc. me ha llamado la atención MongoDB. Esta base de datos realizada en C++, que cuenta, entre sus principales características con ser una base de datos de esquema libre, de alto rendimiento y orientada a documentos.</p>
<p>Coincide que ayer se liberó la versión 2.0.1, aunque no comentaré las nuevas mejoras, sino en sí, lo que hace MongoDB.</p>
<h3>Acceso a Datos</h3>
<p>El sistema de MongoDB es de esquema libre. Esto quiere decir que no requiere de una definición previa de datos, es decir, de hecho, los datos que se almacenan en sus colecciones son heterogéneos completamente.</p>
<p>Mientras que una base de datos relacional, con tablas, se estructura en base de datos, tablas, tuplas y campos, una base de datos, como MongoDB, se estructura en base de datos, colección y datos. Esto quiere decir que, dentro de una colección podría poner el dato:</p>
<pre>
{ a: 1, b: 2, c: 3 }
</pre>
<p>Y acto seguido, agregar otro dato a la colección que sea:</p>
<pre>
{ a:2, [ {nombre: 'Manuel', apellido: 'Rubio', web: 'http://bosqueviejo.net'} ] }
</pre>
<p>Lo que sí es conveniente respetar, al menos, es el primer dato, ya que así las búsquedas son más fáciles, tanto para el sistema como para el usuario (o programador que realiza las consultas).</p>
<h3>NoSQL&#8230; vale, ¿entonces qué?</h3>
<p>En este tipo de base de datos, que son NoSQL, se emplean muchas técnicas para realizar búsquedas, pero MongoDB ha optado, quizás, por la más simple, que es integrar un lenguaje para esta tarea. Por lo que es posible realizar consultas estructurando la información que se pasa a nivel de criterio de búsqueda en&#8230;. ¡JavaScript!</p>
<p>Alguien me dijo que JavaScript era el lenguaje del futuro y, parece que al fin, ese futuro llegó, puesto que hay JavaScript en la programación web, como servidor a través de NodeJS, para el dialplan de FreeSwitch incluso&#8230; y ahora como lenguaje de consulta a una base de datos.</p>
<p>Entonces, vale, aceptamos JavaScript. Esto hace que las consultas se estructuren en <em>hash</em> (objetos realmente), de la siguiente forma:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">db.<span style="color: #660066;">cosas</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'a'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>La estructura sigue el orden de <em>db</em> (como base de datos) y <em>cosas</em> (como colección de datos). Cada base de datos es un objeto que tiene como atributos sus colecciones y cada colección tiene a su vez una serie de métodos que le permiten realizar acciones con su conjunto de datos.</p>
<h3>Buscar o Encontrar</h3>
<p>Aunque hay otras base de datos NoSQL que solo sirven para encontrar (se debe de acceder por un identificador primario o el sistema debe de recorrer todo el conjunto de datos haciendo criba de los registros), MongoDB tiene mecanismos bastante buenos que le permiten realizar búsquedas bastante óptimas sobre el conjunto de datos heterogéneo. Algo tan simple como: la creación de índices.</p>
<p>Podemos crear índices sobre un campo que sepamos que seguramente estará en la mayoría del conjunto de datos (como por ejemplo <em>a</em> en el ejemplo expuesto) y así acelerar las búsquedas en este sentido.</p>
<p>Así mismo, el sistema en JavaScript permite realizar búsquedas basadas en rangos, o incluso con listas de inclusión de la siguiente forma:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">db.<span style="color: #660066;">cosas</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> $or<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">'a'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">'a'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">cosas</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'a'</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> $gt<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> $lte<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ambas consultas, por forma sacarían los dos registros que expusimos de ejemplo arriba, ya que en el primer caso, <em>a</em> puede tomar los valores 1 ó 2, y en el segundo caso <em>a</em> puede tomar valores mayores que cero y menores o iguales que uno.</p>
<p>Hay mucha, pero mucha, más información de esto en el <a href="http://www.mongodb.org/display/DOCS/Manual">manual oficial de MongoDB</a> en su propia página.</p>
<h3>Desde otros lenguajes</h3>
<p>El sistema, realmente es una joya para la gente que programe en JavaScript y se haya lanzado a cosas como <a href="http://nodejs.org">NodeJS</a> y <a href="http://javascriptmvc.com">JavaScript MVC</a>, ya que tendrán la posibilidad de realizar la búsqueda en JavaScript igualmente, y la integración con este lenguaje es la más clara de las que he podido ver (a nivel de envío de datos) ya que se estructura en base a la misma estructura que tiene JavaScript.</p>
<p>Por otro lado, hay implementaciones para <a href="http://us2.php.net/manual/en/mongo.tutorial.php">PHP</a> (la cual he podido ver más de cerca), C, C++, Erlang, Haskell, Java, JavaScript, .NET (C#, F#, PowerShell, etc), Perl, Python, Ruby y Scala, de los que da soporte directo MongoDB, y otros soportados por la comunidad como: ActionScript3, Clojure, ColdFusion, D, Delphi, Factor, Fantom, Go, Groovy, Lisp, Lua, MatLab, Objetive C, Prolog, R, Racket y Smalltalk.</p>
<h3>Conclusiones</h3>
<p>Me ha impresionado muy positivamente esta base de datos, las pruebas que he realizado, de cara a rendimiento y uso a través de objetos han sido muy fáciles y la integración muy clara y sencilla. Es una muy buena opción para la toma de datos heterogéneos, sin duda, pero también como base de datos escalable en el tiempo y de alto rendimiento.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/26/mongodb-base-datos-heterogenea/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Riak: base de datos sin SPOF</title>
		<link>http://bosqueviejo.net/2011/09/14/riak-base-de-datos-sin-spof/</link>
		<comments>http://bosqueviejo.net/2011/09/14/riak-base-de-datos-sin-spof/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 11:07:41 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[basho]]></category>
		<category><![CDATA[dynamo]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[gossip protocol]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[riak]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=837</guid>
		<description><![CDATA[ Dando una vuelta por Internet, buscando información sobre base de datos NoSQL, topé con una (u otra) hecha en Erlang/OTP, al igual que CouchDB, pero que se basa en las mismas directrices para lo que fue desarrollado Erlang/OTP. Esta base de datos es Riak.
Actualización 16/09/2011: se me olvidó comentar que SPOF significa, según sus siglas, Single Point Of Failure, algo así como el punto único de fallo. Se refiere a cuando un sistema, aún teniendo bastante redundancia, tiene un punto único, en la red, en el software o en alguna parte del sistema que, fallando, deja sin servicio a todo.
Como la mayoría de software realizado por empresas y que se adentran en el software libre, Riak tiene dos versiones, una Open Source (que es completa y funcional) y otra Enterprise (que agrega commodities -o facilidades- tales como una interfaz de administración).
La base de datos Riak está basada en el documento escrito por Amazon sobre el sistema de almacenamiento Dynamo, el cual se basa en un sistema de alta disponibilidad, con estructura de almacenamiento del par clave-valor y distribuido. Este documento ha sido seguido, además, por Cassandra (la base de datos de Facebook, liberada y acogida en el seno de [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/riaklogo1-150x150.png" alt="" title="riaklogo" width="150" height="150" class="alignleft size-thumbnail wp-image-858" /> Dando una vuelta por Internet, buscando información sobre base de datos <a href="http://bosqueviejo.net/2010/05/04/nosql/">NoSQL</a>, topé con una (u otra) hecha en <a href="http://bosqueviejo.net/2008/10/08/erlang-concurrente-distribuido-y-en-tiempo-real/">Erlang/OTP</a>, al igual que <a href="http://bosqueviejo.net/2009/03/05/couchdb-rest-y-base-de-datos-documental/">CouchDB</a>, pero que se basa en las mismas directrices para lo que fue desarrollado Erlang/OTP. Esta base de datos es <a href="http://wiki.basho.com/Riak.html">Riak</a>.</p>
<p><strong>Actualización 16/09/2011</strong>: se me olvidó comentar que <a href="http://es.wikipedia.org/wiki/Single_point_of_failure">SPOF</a> significa, según sus siglas, <em>Single Point Of Failure</em>, algo así como el punto único de fallo. Se refiere a cuando un sistema, aún teniendo bastante redundancia, tiene un punto único, en la red, en el software o en alguna parte del sistema que, fallando, deja sin servicio a todo.</p>
<p>Como la mayoría de software realizado por empresas y que se adentran en el software libre, Riak tiene dos versiones, una Open Source (que es completa y funcional) y otra Enterprise (que agrega <em>commodities</em> -o facilidades- tales como una interfaz de administración).</p>
<p>La base de datos Riak está basada en el documento escrito por Amazon sobre el sistema de almacenamiento <a href="http://en.wikipedia.org/wiki/Dynamo_(storage_system)">Dynamo</a>, el cual se basa en un sistema de alta disponibilidad, con estructura de almacenamiento del par clave-valor y distribuido. Este documento ha sido seguido, además, por <a href="http://cassandra.apache.org/">Cassandra</a> (la base de datos de Facebook, liberada y acogida en el seno de la Fundación Apache, y que ha sido implementada desde entonces por Digg, Twitter, Reddit, Rackspace, etc.) y por <a href="http://project-voldemort.com/">Voldemort</a> (la base de datos de LinkedIn).</p>
<h3>Características principales</h3>
<p>Riak, además de seguir las bases de Dynamo, ha agregado otras características propias a la lista, quedando (visto en su <a href="http://www.basho.com/products_architecture.php">página web oficial</a>) la siguiente lista de características a destacar:</p>
<ul>
<li><strong>Escalabilidad</strong>: la escalabilidad con Riak es lineal, predecible y de coste efectivo. Agregar nuevas máquinas no significa tener una avalancha de de peticiones que ponga en peligro la efectividad del sistema. Se pueden ir agregando o eliminando máquinas sin mayor problema, y sin que suponga una carga excesiva para el sistema base.</li>
<li><strong>Tolerancia a fallos</strong>: el cluster soporta o admite fallos en nodos aislados, o incluso en partes del cluster, está preparado para no perder datos ante este tipo de fallos. El sistema ha sido diseñado con fallos de máquinas e interrupciones de servicio de red como norma, no como excepción.</li>
<li><strong>Alta disponibilidad</strong>: para alta disponibilidad el sistema debe de estar disponible, no solo para lecturas, sino también para escrituras. La arquitectura de share-nothing (nada compartido) hace que cada nodo en el cluster esté habilitado para realizar lecturas y escrituras, por lo que, la alta disponibilidad está garantizada.</li>
<li><strong>Replicación</strong>: dependiendo de las necesidades, Riak se puede configurar para replicar entre múltiples clusters iguales o diseñar uno o más clusters como solo-lectura o backup. Cada nodo en el cluster puede responder a las peticiones de lecutra/escritura, y el evento de replicación asegura que todos los clusters sean actualizados. Los algoritmos se ejecutan en cada nodo asegurando la consistencia de datos.</li>
</ul>
<p>En base al teorema CAP del Dr. Eric Brewer, las tres propiedades deseadas de un sistema distribuido son: consistencia, disponibilidad y partición (tolerancia a fallos). El teorema establece que puedes solo puedes tener dos de las tres propiedades en cada momento. Riak se enfoca en Disponibilidad y Partición. Esta elección pone a Riak en el campo de la consistencia eventual. Sin embargo, la ventana para <em>consistencia eventual</em> es en términos de milisegundos, lo que es suficiente para la mayoría de aplicaciones.</p>
<h3>¿Cómo funciona?</h3>
<p>No me quiero extender mucho, ya que esta información está disponible (aunque en inglés) en la propia web de Riak, en <a href="http://wiki.basho.com/Concepts.html">Concepts</a>, así que resumiré un poco.</p>
<p>El <strong>almacén de datos</strong> se realiza en base a el par clave-valor, es lo que podríamos llamar una base de datos hash. No obstante, la clave se compone de <em>bucket</em> y <em>key</em>, que son como en Erlang el módulo y la función, o en Java el paquete y la clase. El conjunto bucket/key es la unidad de organización única que puede emplearse.</p>
<p>El sistema admite también el uso de <strong>enlaces</strong> (links). Esto quiere decir que el contenido de un bucket/key, puede ser un contenido o un enlace a otro bucket/key que tenga su propio contenido. Algo así como el enlace simbólico en los sistemas de ficheros de Unix/Linux/BSD/&#8230;</p>
<p>Además, el contenido, puede ir estructurado en forma de <strong>metadatos</strong>, es decir, como las cabeceras de los mensajes HTTP, para disponer de arrays asociativos (hash) dentro del contenido.</p>
<p>Uso de diferentes <em>backends</em>. En la versión 0.12, Bitcask se estableció como backend para Riak, pero hay más, aquí ponemos un listado de los disponibles:</p>
<ul>
<li><strong>Bitcask</strong>: simple pero potente almacenaje de pares clave-valor. Es de baja latencia y alto rendimiento.</li>
<li><strong>DETS / ETS</strong>: tablas incorporadas en Erlang para el almacenamiento de información.</li>
<li><strong>Erlang Balanced Trees (gb_trees)</strong>: sistema de árbol balanceado. Rápido para leer, pero algo lento para escribir.</li>
<li><strong>Innostore</strong>: basado en el engine InnoDB de MySQL. Debido a restricciones de licencia, se proporciona por separado.</li>
</ul>
<p>Cada cluster que se configura de Riak, consta de los siguientes elementos:</p>
<ul>
<li><strong>Nodos</strong>: nodos físicos, o máquinas, de las que se compone el cluster.</li>
<li><strong>Nodos Virtuales</strong>: nodos virtuales (o vnodes) que corren en cada máquina. Cada máquina física puede contener uno o varios nodos virtuales.</li>
<li><strong>Particiones</strong>: cada cluster Riak tiene un entero de 160-bits dividido en particiones ecuánimes. Cada vnode reclamará una partición del anillo.</li>
</ul>
<p>Cada nodo en el cluster es responsable del 1/(número total de nodos físicos) del anillo. Puedes determinar el número de vnodes en cada nodo calculando el (número de particiones)/(número de nodos). Por ejemplo, un anillo con 32 particiones, compuesto por cuatro nodos físicos, tendrá aproximadamente ocho vnodos por nodo. Esta configuración es representada por el siguiente diagrama:</p>
<p><a href="http://bosqueviejo.net/wp-content/uploads/riak-ring.png"><img src="http://bosqueviejo.net/wp-content/uploads/riak-ring-300x205.png" alt="" title="riak-ring" width="300" height="205" class="aligncenter size-medium wp-image-866" /></a></p>
<p>Riak está diseñado para ser un sistema distribuido, cuantos más nodos haya en el sistema, más rápido funcionará. </p>
<p>No hay <strong>nodo maestro</strong>, todos los nodos en Riak son iguales. Cada nodo es completamente capaz de servir cualquier petición de cliente. Esto es posible debido a la forma en la que Riak usa la consistencia de hash para distribuir datos a través del cluster, que se realiza a través de un <a href="http://en.wikipedia.org/wiki/Gossip_protocol">gossip protocol</a>.</p>
<h3>Sobre la replicación</h3>
<p>Riak controla tantas réplicas como datos son mantenidos a través de una configuración llamada <em>n-valor</em>. Este valor tiene una configuración por defecto en cada nodo pero puede ser sobreescrito por cada bucket. Los objetos de Riak heredan el n-valor de su bucket padre. Todos los nodos en el mismo cluster deben de acordar y usar el mismo n-valor.</p>
<p>Por ejemplo, aquí hay una representación de que sucede cuando n-valor es 3 (esta es la configuración por defecto). Cuando almacenas el dato en el bucket con un n-valor de tres, el dato se replicará a tres particiones separadas del anillo.</p>
<p><a href="http://bosqueviejo.net/wp-content/uploads/riak-data-distribution.png"><img src="http://bosqueviejo.net/wp-content/uploads/riak-data-distribution-300x157.png" alt="" title="riak-data-distribution" width="300" height="157" class="aligncenter size-medium wp-image-870" /></a></p>
<h3>Y cuando un nodo falla o se agrega otro nodo, ¿qué sucede?</h3>
<p>Riak usa una técnica llamada <strong>hinted handoff</strong>, para compensar el cluster en el momento que un nodo falla. Los vecinos del nodo fallido tomarán relevo y realizarán el trabajo de ese nodo permitiendo al cluster trabajar de forma normal. Esto puede considerarse una forma de auto-curación.</p>
<p>Si se agrega un nodo nuevo, en cambio, se rebalancean los datos.</p>
<h3>Algunas pegas&#8230; siempre las hay</h3>
<p>Primero, los buckets que usan un conjunto de propiedades no estandar forzarán a Riak a enviar vía gossip más datos a través del cluster. Los datos adicionales pueden ralentizar el proceso. Segundo, algunos backends, como Innostore, almacenan cada bucket como una entidad separada. Esto puede causar que nos quedemos sin recursos tales como manejadores de ficheros. Estas restricciones de recursos pueden no impactar al rendimiento, pero representarán otro límite en el máximo número de buckets a gestionar.</p>
<h3>Conclusiones</h3>
<p>A nivel teórico, todo bien, parece. Habrá que realizar un banco de pruebas y ver qué tal va el sistema. De momento, me he quedado sin tiempo (del que había planificado) para escribir este artículo, por lo que, dejo las pruebas para la siguiente parte&#8230; que entraremos de lleno en la práctica.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/09/14/riak-base-de-datos-sin-spof/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FTS (I): Búsqueda de Texto Completo en PostgreSQL</title>
		<link>http://bosqueviejo.net/2010/12/16/fts-i-busqueda-de-texto-completo-en-postgresql/</link>
		<comments>http://bosqueviejo.net/2010/12/16/fts-i-busqueda-de-texto-completo-en-postgresql/#comments</comments>
		<pubDate>Thu, 16 Dec 2010 14:19:32 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[fts]]></category>
		<category><![CDATA[pgadmin]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=567</guid>
		<description><![CDATA[Al final me dió por actualizar los PostgreSQL a la nueva versión 9.0, junto con el pgadmin3, y al entrar a la aplicación (versión 1.12.1) me encuentro que hay unos cuatro iconos nuevos: Configuraciones FTS, Diccionarios FTS, Analizadores FTS y Plantillas FTS. ¿y qué es todo esto?
Fuente: documentación oficial de PostgreSQL 9.0.
El concepto de FTS
La búsqueda de texto completa (Full Text Searching o FTS) proporciona la capacidad de identificar documentos de lenguaje natural que satisfacen una consulta y, opcionalmente, ordenarlos por relevancia a la consulta. El tipo más común de búsqueda es buscar todos los documentos que contengan los términos de la consulta y los retorna en orden de similitud. Los conceptos de consulta y similitud son muy flexibles y dependen de la aplicación específica. La búsqueda más simple considera una consulta como un conjunto de palabras y su similitud con la frecuencia de aparición de las mismas en el documento.
¿Qué es un documento?
Un documento es la unidad de búsqueda en un sistema FTS; por ejemplo, un artículo de una revista o un mensaje de email. El motor de búsqueda de texto debe estar preparado para analizar documentos y almacenar asociaciones de lexemas (palabras clave) con su documento padre. Después, [...]]]></description>
			<content:encoded><![CDATA[<p>Al final me dió por actualizar los <a href="http://www.postgresql.org/">PostgreSQL</a> a la nueva versión 9.0, junto con el <a href="http://www.pgadmin.org/">pgadmin3</a>, y al entrar a la aplicación (versión 1.12.1) me encuentro que hay unos cuatro iconos nuevos: Configuraciones FTS, Diccionarios FTS, Analizadores FTS y Plantillas FTS. ¿y qué es todo esto?</p>
<p>Fuente: <a href="http://www.postgresql.org/docs/9.0/static/textsearch.html">documentación oficial de PostgreSQL 9.0</a>.</p>
<h3>El concepto de FTS</h3>
<p>La búsqueda de texto completa (Full Text Searching o FTS) proporciona la capacidad de identificar documentos de lenguaje natural que satisfacen una consulta y, opcionalmente, ordenarlos por relevancia a la consulta. El tipo más común de búsqueda es buscar todos los documentos que contengan los términos de la consulta y los retorna en orden de similitud. Los conceptos de consulta y similitud son muy flexibles y dependen de la aplicación específica. La búsqueda más simple considera una consulta como un conjunto de palabras y su similitud con la frecuencia de aparición de las mismas en el documento.</p>
<h3>¿Qué es un documento?</h3>
<p>Un documento es la unidad de búsqueda en un sistema FTS; por ejemplo, un artículo de una revista o un mensaje de email. El motor de búsqueda de texto debe estar preparado para analizar documentos y almacenar asociaciones de lexemas (palabras clave) con su documento padre. Después, estas asociaciones son usadas para buscar documentos que contengan esas palabras clave.</p>
<p>Para PostgreSQL un documento es, normalmente, un campo de texto, o una concatenación de varios campos de texto almacenados en una o varias tablas, o un texto obtenido de forma dinámica. En otras palabras, un documento puede ser construido de diferentes formas y puede no estar almacenado en ningún sitio. Por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> title <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' '</span> <span style="color: #66cc66;">||</span> author <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' '</span> <span style="color: #66cc66;">||</span> abstract <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' '</span> <span style="color: #66cc66;">||</span> body <span style="color: #993333; font-weight: bold;">AS</span> document
<span style="color: #993333; font-weight: bold;">FROM</span> messages
<span style="color: #993333; font-weight: bold;">WHERE</span> mid <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">12</span>;</pre></div></div>

<h3>Búsqueda de texto básica</h3>
<p>El FTS en PostgreSQL está basada en el operador @@, el cual retorna <em>true</em> si un <em>tsvector</em> (documento) coincide con una <em>tsquery</em> (consulta). No importa el orden en el que se pongan:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">'tres tristes tigres comieron trigo de un trigal'</span>::tsvector @@ <span style="color: #ff0000;">'tristes &amp; tigres'</span>::tsquery;</pre></div></div>

<h3>Búsqueda de Resultados por Ránking</h3>
<p>Ránking intenta medir como de relevantes son los documentos para una consulta en particular, así que cuando hay muchas coincidencias, la más relevante se muestra primero. PostgreSQL proporciona dos funciones de ránking predefinidas, las cuales tienen en cuenta el léxico, proximidad y estructura de la información. Esto es, que consideran como aparecen de frecuentes los términos en el documento, como de juntos están en el documento y como de importante es la parte de el documento donde aparecen. Sin embargo, el concepto de relevancia es vago y muy específico de la aplicación. Aplicaciones diferentes pueden requerir información adicional para el ránking. Las funciones construidas para ránking son solo ejemplos. Puedes escribir tus propias funciones de ránking y/o combinar sus resultados con factores adicionales para ajustarlas a tus necesidades específicas.</p>
<p>Aquí hay un ejemplo que, selecciona solo las diez coincidencias más altas en el ránking:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> title<span style="color: #66cc66;">,</span> ts_rank_cd<span style="color: #66cc66;">&#40;</span>textsearch<span style="color: #66cc66;">,</span> query<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> rank
<span style="color: #993333; font-weight: bold;">FROM</span> apod<span style="color: #66cc66;">,</span> to_tsquery<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'neutrino|(dark &amp; matter)'</span><span style="color: #66cc66;">&#41;</span> query
<span style="color: #993333; font-weight: bold;">WHERE</span> query @@ textsearch
<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> rank <span style="color: #993333; font-weight: bold;">DESC</span>
<span style="color: #993333; font-weight: bold;">LIMIT</span> <span style="color: #cc66cc;">10</span>;</pre></div></div>

<p>El resultado:</p>
<pre>
                     title                     |   rank
-----------------------------------------------+----------
 Neutrinos in the Sun                          |      3.1
 The Sudbury Neutrino Detector                 |      2.4
 A MACHO View of Galactic Dark Matter          |  2.01317
 Hot Gas and Dark Matter                       |  1.91171
 The Virgo Cluster: Hot Plasma and Dark Matter |  1.90953
 Rafting for Solar Neutrinos                   |      1.9
 NGC 4650A: Strange Galaxy and Dark Matter     |  1.85774
 Hot Gas and Dark Matter                       |   1.6123
 Ice Fishing for Cosmic Neutrinos              |      1.6
 Weak Lensing Distorts the Universe            | 0.818218
</pre>
<p>La misma usando un ranking normalizado:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> title<span style="color: #66cc66;">,</span> ts_rank_cd<span style="color: #66cc66;">&#40;</span>textsearch<span style="color: #66cc66;">,</span> query<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">32</span> <span style="color: #808080; font-style: italic;">/* rank/(rank+1) */</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> rank
<span style="color: #993333; font-weight: bold;">FROM</span> apod<span style="color: #66cc66;">,</span> to_tsquery<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'neutrino|(dark &amp; matter)'</span><span style="color: #66cc66;">&#41;</span> query
<span style="color: #993333; font-weight: bold;">WHERE</span>  query @@ textsearch
<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> rank <span style="color: #993333; font-weight: bold;">DESC</span>
<span style="color: #993333; font-weight: bold;">LIMIT</span> <span style="color: #cc66cc;">10</span>;</pre></div></div>

<p>Y su resultado:</p>
<pre>
                     title                     |        rank
-----------------------------------------------+-------------------
 Neutrinos in the Sun                          | 0.756097569485493
 The Sudbury Neutrino Detector                 | 0.705882361190954
 A MACHO View of Galactic Dark Matter          | 0.668123210574724
 Hot Gas and Dark Matter                       |  0.65655958650282
 The Virgo Cluster: Hot Plasma and Dark Matter | 0.656301290640973
 Rafting for Solar Neutrinos                   | 0.655172410958162
 NGC 4650A: Strange Galaxy and Dark Matter     | 0.650072921219637
 Hot Gas and Dark Matter                       | 0.617195790024749
 Ice Fishing for Cosmic Neutrinos              | 0.615384618911517
 Weak Lensing Distorts the Universe            | 0.450010798361481
</pre>
<h3>¿Hay más?</h3>
<p>Pues claaaaaro que sí. Pero de momento lo dejo aquí, en previsión de hacer una segunda entrega con cosas como resultados resaltados (highlighting results) y sobretodo, la personalización de los analizadores, plantillas, configuraciones y diccionarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/12/16/fts-i-busqueda-de-texto-completo-en-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lógica de negocio en la base de datos</title>
		<link>http://bosqueviejo.net/2010/06/09/logica-de-negocio-en-la-base-de-datos/</link>
		<comments>http://bosqueviejo.net/2010/06/09/logica-de-negocio-en-la-base-de-datos/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 23:50:15 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[ingeniería de negocio]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=444</guid>
		<description><![CDATA[Desde mi punto de vista, esto puede suponer una locura total y una falta de forma en lo que respecta al uso de un almacén de datos visto como tal. No obstante, hay sistemas de base de datos que implementan una capa de negocio bastante interesante, donde otros sistemas solo dan una opción de scripting que da algo de miedo.
En postgresql, por ejemplo, el sistema de lenguajes que se pueden usar e implementar para la creación de funciones: PL/pgSQL, PL/Tcl, PL/Python, PL/Perl, PL/PHP, PL/Java, PL/Ruby, &#8230;; todos ellos se pueden ver en la página de documentación de PostgreSQL.
Esto quiere decir que, en una llamada a una función SQL se puede emplear una función específica programada en cualquiera de estos lenguajes, así como el lanzamiento de un trigger, puede ser compuesto por una serie de llamadas a estos procedimientos.
No obstante, la gente suele tener bastante miedo a usar estos sistemas para lógica de negocio por varios motivos, pero principalmente porque el despliegue es complejo. 
Sí, en ciertos SGBD, un despliegue y mantenimiento resulta algo complejo, el hecho de mantener unas versiones y saber exactamente qué hay en producción y qué no hay, así como el hecho de que un cambio pueda [...]]]></description>
			<content:encoded><![CDATA[<p>Desde mi punto de vista, esto puede suponer una locura total y una falta de forma en lo que respecta al uso de un almacén de datos visto como tal. No obstante, hay sistemas de base de datos que implementan una capa de negocio bastante interesante, donde otros sistemas solo dan una opción de <em>scripting</em> que da algo de miedo.</p>
<p>En <em>postgresql</em>, por ejemplo, el sistema de lenguajes que se pueden usar e implementar para la creación de funciones: PL/pgSQL, PL/Tcl, PL/Python, PL/Perl, PL/PHP, PL/Java, PL/Ruby, &#8230;; todos ellos se pueden ver en la página de <a href="http://www.postgresql.org/docs/8.4/static/external-pl.html">documentación de PostgreSQL</a>.</p>
<p>Esto quiere decir que, en una llamada a una función SQL se puede emplear una función específica programada en cualquiera de estos lenguajes, así como el lanzamiento de un trigger, puede ser compuesto por una serie de llamadas a estos procedimientos.</p>
<p>No obstante, la gente suele tener bastante miedo a usar estos sistemas para lógica de negocio por varios motivos, pero principalmente porque <strong>el despliegue es complejo</strong>. </p>
<p>Sí, en ciertos SGBD, un despliegue y mantenimiento resulta algo complejo, el hecho de mantener unas versiones y saber exactamente qué hay en producción y qué no hay, así como el hecho de que un cambio pueda hacerse en cualquier momento y pueda desvirtuar lo que haya en el repositorio en sí. </p>
<p>No obstante, puede solventarse con el uso de sistemas como <a href="http://blog.aizatto.com/2007/05/27/activerecord-migrations-without-rails/">migrations de rails</a>, o similares. Es decir, no cargar nada directamente desde una interfaz abierta o desde la consola, sino desde una herramienta que permita controlar las subidas en forma de versiones.</p>
<p>En sí, el sistema de CHECK de PostgreSQL permite y da ventajas al usuario de desarrollar parte de la lógica de negocio. Allá donde no llegan los mecanismos típicos, es donde se puede comenzar a tirar de las funciones desarrolladas en cualquier lenguaje, con la potencia de que estas pueden ser lanzadas como CONSTRAINT, TRIGGERS o de forma inmediata en una consulta SQL.</p>
<p>En mi opinión, el uso de PostgreSQL como capa de datos, y además como capa de negocio, es una opción tan válida como extraer esa lógica a otros sistemas externos. La única nota negativa, es la interconexión, que obliga a que se haga con el conector de base de datos mientras que desarrollando la capa de negocio en otro tipo de framework, este acceso podría bien ser por mecanismos más orientados a RPC como SOAP o REST.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/06/09/logica-de-negocio-en-la-base-de-datos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NoSQL: sistemas de almacenamiento en lugar de bases de datos</title>
		<link>http://bosqueviejo.net/2010/05/04/nosql/</link>
		<comments>http://bosqueviejo.net/2010/05/04/nosql/#comments</comments>
		<pubDate>Tue, 04 May 2010 13:29:18 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[bigtable]]></category>
		<category><![CDATA[hypertable]]></category>
		<category><![CDATA[mapreduce]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=433</guid>
		<description><![CDATA[Hace poco me topé con una definición que me causó un poco de desconcierto, no llegaba a entender bien el porqué había muchas empresas y profesionales que comenzaban a usar el NoSQL.
Leyendo el blog de dos ideas con referencia a un artículo que publicaron llamado NoSQL: el movimiento en contra de las bases de datos, se comenta una conferencia en la que grandes profesionales del sector de los sistemas, con necesidades de escalabilidad y alta capacidad de almacenaje, mencionaban sus soluciones NoSQL.
Entre ellos, representantes de empresas como Google, Amazon, Facebook, Twitter, LinkedIn, &#8230; pusieron en conocimiento de todos los asistentes sus soluciones ya desarrolladas y en funcionamiento para suplir las carencias que las bases de datos tradicionales no podían cubrir.
Las ventajas de NoSQL
Las ventajas de estos sistemas de almacenamiento (hay muchos integrantes de este movimiento que consideran una aberración llamarlos bases de datos) son las siguientes:

Pueden manejar enormes cantidades de datos: esto es debido a su propia estructura distribuida. Por ejemplo, HyperTable, una implementación de código abierto basada en BigTable (de Google), puede escribir 1000 millones de celdas de datos por día. Al igual que BigTable, con MapReduce, es capaz de manejar 20 petabytes diarios.
Se ejecutan en clusters de máquinas [...]]]></description>
			<content:encoded><![CDATA[<p>Hace poco me topé con una definición que me causó un poco de desconcierto, no llegaba a entender bien el porqué había muchas empresas y profesionales que comenzaban a usar el <a href="http://es.wikipedia.org/wiki/NoSQL">NoSQL</a>.</p>
<p>Leyendo el blog de <a href="http://www.dosideas.com">dos ideas</a> con referencia a un artículo que publicaron llamado <a href="http://www.dosideas.com/noticias/base-de-datos/657-nosql-el-movimiento-en-contra-de-las-bases-de-datos.html">NoSQL: el movimiento en contra de las bases de datos</a>, se comenta una conferencia en la que grandes profesionales del sector de los sistemas, con necesidades de escalabilidad y alta capacidad de almacenaje, mencionaban sus soluciones NoSQL.</p>
<p>Entre ellos, representantes de empresas como Google, Amazon, Facebook, Twitter, LinkedIn, &#8230; pusieron en conocimiento de todos los asistentes sus soluciones ya desarrolladas y en funcionamiento para suplir las carencias que las bases de datos tradicionales no podían cubrir.</p>
<h3>Las ventajas de NoSQL</h3>
<p>Las ventajas de estos sistemas de almacenamiento (hay muchos integrantes de este movimiento que consideran una aberración llamarlos <em>bases de datos</em>) son las siguientes:</p>
<ul>
<li><strong>Pueden manejar enormes cantidades de datos</strong>: esto es debido a su propia estructura distribuida. Por ejemplo, <a href="http://www.hypertable.org/">HyperTable</a>, una implementación de código abierto basada en <a href="http://labs.google.com/papers/bigtable.html">BigTable</a> (de Google), puede escribir 1000 millones de celdas de datos por día. Al igual que BigTable, con <a href="http://es.wikipedia.org/wiki/MapReduce">MapReduce</a>, es capaz de manejar 20 petabytes diarios.</li>
<li><strong>Se ejecutan en clusters de máquinas baratas</strong>: estos sistemas no requieren de apenas computación, en comparación con los sitemas gestores de base de datos tradicionales y basados en SQL, por lo que se pueden montar en máquinas de un coste más reducido y en mayor número, gracias a su nivel de escalabilidad.</li>
<li><strong>No generan cuellos de botella</strong>: el problema de fondo de los sistemas SQL, es que deben de transcribir cada sentencia para poder ser ejecutada y, cada sentencia compleja requiere, además de un nivel de ejecución más concreto para poderse llevar a cabo, por lo que constituye un punto de entrada común, único y conflictivo en base a rendimiento.</li>
<li><strong>Solo lo estrictamente necesario</strong>: son sistemas simples que no tienen un sistema de consulta complejo ni con capacidad declarativa para en una sola línea realizar una cantidad interna de operaciones desorbitada.</li>
</ul>
<h3>Las desventajas</h3>
<p>Bueno, y después de poner estos sistemas por las nubes&#8230; ahora toca pegar un poco los pies al suelo y darse de cara con la realidad. Quiero decir que, sí, hay desventajas, esto no es una panacea que sirva para paliar la necesidad del almacenaje de datos para todos los casos. En entornos de sistemas de información, en gestión de cuentas, y entornos en los que es preferible que los datos puedan tener algo más de inteligencia, en lugar de algo más de rapidez, estos sistemas no son aconsejables, ya que la única, pero mayor desventaja de estos es que <strong>no respetan <a href="http://es.wikipedia.org/wiki/ACID">ACID</a></strong>.</p>
<h3>Conclusiones</h3>
<p>En mi caso particular, trabajando en un área de sistemas relacionado con la telefonía en el que premia más la velocidad de tratamiento de datos, así como la capacidad para poder manejar gran cantidad de los mismos, y en el que la integridad referencial es algo que ni se usa ni se tiene en cuenta, sí, es una solución real, una forma de ahorrarse gran cantidad de código y dolores de cabeza con respecto a la escalabilidad y concurrencia de la información dentro de la plataforma tecnológica.</p>
<p>Ahora, si mi trabajo fuese desarrollar sistemas CRM, ERP o similares, que dependen más de la integridad de los datos, así como su relación y unas reglas de negocio establecidas y programadas, es innegable que las bases de datos con soporte SQL agregan mucho valor en este sentido.</p>
<p>Por lo que, podemos concluir en que, para programación de sistemas son un recurso muy útil y que puede facilitar y paliar problemáticas relacionadas con el almacenaje de información, así como el tratamiento in-situ de la misma con cara a la lógica del servicio, y por otro lado, si lo que premia más es tener una lógica de negocio bien definida, en ese caso, quizás es mejor seguir usando los sistemas SQL.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/05/04/nosql/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>El futuro de MySQL</title>
		<link>http://bosqueviejo.net/2010/03/02/el-futuro-de-mysql/</link>
		<comments>http://bosqueviejo.net/2010/03/02/el-futuro-de-mysql/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 15:55:56 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[drizzle]]></category>
		<category><![CDATA[free software]]></category>
		<category><![CDATA[mariadb]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=240</guid>
		<description><![CDATA[Desde que MySQL fuese vendida a Sun Microsystems, ha habido bastante gente que ha visto con otros ojos el proyecto, mostrándose algo escépticos a que MySQL pudiera seguir siendo lo que venía siendo, una base de datos libre sin mayores pretensiones. Pero siendo Sun Microsystems una empresa que ha realizado mucho código para la comunidad, pero también ha guardado mucho otro de forma recelosa, teníamos nuestras dudas.
El problema real vino cuando Sun Microsystems fue adquirida por Oracle. Esta adquisición puso a MySQL en la duda de si seguiría siendo lo que es, o pasaría a ser otro producto más recortado en su versión comunitaria y ofrecido por un precio medio/alto a empresas que se lo puedan permitir. Como si de una versión light de Oracle DB se tratase.
Entre todo este tumulto, en parte levantado por Monty, uno de los principales desarrolladores de MySQL, que se fue de la empresa cuando comenzó todo el lío, surgen varias versiones de MySQL, forks, que prometen seguir la línea original y seguir apostando por el crecimiento de este sistema dentro de la comunidad y el software libre.
Una de las apuestas es MariaDB, promovida por el propio Monty, es un fork del último código estable [...]]]></description>
			<content:encoded><![CDATA[<p>Desde que <a href="http://www.error500.net/sun-compra-mysql">MySQL fuese vendida a Sun Microsystems</a>, ha habido bastante gente que ha visto con otros ojos el proyecto, mostrándose algo escépticos a que MySQL pudiera seguir siendo lo que venía siendo, una base de datos libre sin mayores pretensiones. Pero siendo Sun Microsystems una empresa que ha realizado mucho código para la comunidad, pero también ha guardado mucho otro de forma recelosa, teníamos nuestras dudas.</p>
<p>El problema real vino cuando <a href="http://www.error500.net/articulo/sun-microsystems-acaba-en-manos-oracle">Sun Microsystems fue adquirida por Oracle</a>. Esta adquisición puso a MySQL en la duda de si seguiría siendo lo que es, o pasaría a ser otro producto más recortado en su versión comunitaria y ofrecido por un precio medio/alto a empresas que se lo puedan permitir. Como si de una versión <em>light</em> de Oracle DB se tratase.</p>
<p>Entre todo este tumulto, <a href="http://www.xombra.com/go_news.php?articulo=4125">en parte levantado por Monty</a>, uno de los principales desarrolladores de MySQL, que se fue de la empresa cuando comenzó todo el lío, surgen varias versiones de MySQL, forks, que prometen seguir la línea original y seguir apostando por el crecimiento de este sistema dentro de la comunidad y el software libre.</p>
<p>Una de las apuestas es <a href="http://askmonty.org/wiki/index.php/MariaDB"><strong>MariaDB</strong></a>, promovida por el propio Monty, es un fork del último código estable de MySQL, agregando todos los patchs que no se incluyeron en MySQL y dando soporte a problemas que parece que los desarrolladores principales de MySQL han olvidado.</p>
<p>En otro punto se sitúa el proyecto <a href="http://drizzle.org/wiki/About_Drizzle"><strong>Drizzle</strong></a>, que intenta seguir los ideales iniciales de MySQL en un punto en los que muchos de los desarrolladores que pertenecían a esta comunidad, consideran que se torció el desarrollo principal.</p>
<p>Con esto podemos decir que el espíritu de MySQL no ha muerto, ni morirá, puesto que seguirá vivo en dos ramas separadas de su código original en los momentos clave en los que cada comunidad vió que era el momento de un cambio.</p>
<p>Como nota curiosa, el ecosistema de protección de los sistemas gestores de base de datos abiertas (<a href="http://odba.org/about/">Open Database Alliance</a>), se encarga de la promoción entorno a los sistemas gestores de las base de datos. Una propuesta interesante que promete un poco de seguridad dentro de este entorno.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/03/02/el-futuro-de-mysql/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>MVCC: Control de Concurrencia para Múltiples Versiones de PostgreSQL</title>
		<link>http://bosqueviejo.net/2009/03/13/mvcc-control-de-concurrencia-para-multiples-versiones-de-postgresql/</link>
		<comments>http://bosqueviejo.net/2009/03/13/mvcc-control-de-concurrencia-para-multiples-versiones-de-postgresql/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 08:56:08 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[servidores]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/wordpress/?p=113</guid>
		<description><![CDATA[El sistema de base de datos PostgreSQL integra un sistema de control de concurrencia para múltiples versiones, en principio. Esto no es más que un sistema que se encarga de mantener copias sobre los datos de forma paralela, para acelerar el sistema de escritura de datos a disco duro, haciendo un control de concurrencia entre las distintas versiones que se van escribiendo.
El problema que intenta solucionar este sistema es el siguiente. Imagina que tenemos un sistema que hace múltiples escrituras y lecturas de una base de datos. No es difícil, seguro que conoces cientos de sistemas que lo hacen. Ahora, ten en cuenta que, los accesos a base de datos, depende para qué, realizan ciertos bloqueos, para asegurarse de que la información a modificar o a leer (incluso) no es modificada por nadie, hasta que termine su actividad.
En MySQL, por ejemplo, existen distintos tipos de bloqueos, muchos de ellos automáticos, que hacen el bloqueo de una tabla completa, o de ciertas partes específicas, al hacer una actividad de modificación, o un bloqueo compartido, para hacer actividades de lectura (solo bloquea en este caso a los que intentan escribir).
Pero en tema de índices, hay muchos SGBD que usan sistemas de índices [...]]]></description>
			<content:encoded><![CDATA[<p>El sistema de base de datos PostgreSQL integra un sistema de control de concurrencia para múltiples versiones, en principio. Esto no es más que un sistema que se encarga de mantener copias sobre los datos de forma paralela, para acelerar el sistema de escritura de datos a disco duro, haciendo un control de concurrencia entre las distintas versiones que se van escribiendo.</p>
<p>El problema que intenta solucionar este sistema es el siguiente. Imagina que tenemos un sistema que hace múltiples escrituras y lecturas de una base de datos. No es difícil, seguro que conoces cientos de sistemas que lo hacen. Ahora, ten en cuenta que, los accesos a base de datos, depende para qué, realizan ciertos bloqueos, para asegurarse de que la información a modificar o a leer (incluso) no es modificada por nadie, hasta que termine su actividad.</p>
<p>En MySQL, por ejemplo, existen distintos tipos de bloqueos, muchos de ellos automáticos, que hacen el bloqueo de una tabla completa, o de ciertas partes específicas, al hacer una actividad de modificación, o un bloqueo <em>compartido</em>, para hacer actividades de lectura (solo bloquea en este caso a los que intentan escribir).</p>
<p>Pero en tema de índices, hay muchos SGBD que usan sistemas de índices que al actualizarse, se bloquean completamente, dejando, no solo las escrituras bloqueadas, sino también las lecturas, creando un <em>lag</em> de acceso a los datos.</p>
<p>Interbase fue la primera base de datos que eliminó la contención, los <em>deadlocks</em> y garantizaba transacciones ACID mediante el sistema MVCC. La idea es: <strong>no actualizar ni eliminar nunca una fila del disco</strong>. Si deseas actualizar, se agrega una nueva fila con la misma clave primaria, la cual <em>oculta</em> la antigua fila. Si deseas eliminar, agrega una nueva fila que etiqueta la clave primaria como eliminada, la cual oculta la antigua fila.</p>
<p>Las viejas filas no eran nunca actualizadas, así que no era necesario implementar ningún sistema de bloqueo y la contención (o espera) mágicamente desapareció.</p>
<p>El sistema, no obstante, tiene pequeños defectos: usa más espacio de disco y puede ser algo más lento a la hora de leer datos. La buena noticia es que los datos se pueden respaldar (realizarse un <em>backup</em>) en cualquier momento sin bloquear el sistema.</p>
<p>En MySQL, los tipos de tablas Falcon (a partir de la versión 6.0) e InnoDB (antes de la 6.0), implementan este sistema para las actualizaciones (<em>updates</em>) usando bloqueo a nivel de fila, lo cual puede causar un tiempo de espera para otros procesos (contención).</p>
<p>En PostgreSQL se usa el comando <a href="http://es.tldp.org/Postgresql-es/web/navegable/user/sql-vacuum.html">VACUUM</a> para actualizar las base de datos, es decir, implementar las transacciones agregadas al final en lugar de a las que reemplazan y eliminar las tuplas marcadas para reclamar más espacio en disco. Esta operación demora, pero hace que la base de datos pase de un consumo alto de disco duro, al ajustado que debe de ser, antes de la próxima sesión crítica <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Hay otras bases de datos que también implementan <a href="http://en.wikipedia.org/wiki/Multiversion_concurrency_control">Multiversion concurrency control</a>, tal y como menciona la <a href="http://en.wikipedia.org">wikipedia</a>, tales como:</p>
<ul>
<li><a href="http://www.oracle.com/technology/products/berkeley-db/index.html">Berkeley DB</a>: que es una base de datos a nivel de fichero, como puede ser SQLite, pero sin uso del lenguaje SQL.</li>
<li><a href="http://couchdb.apache.org/">CouchDB</a>: de la cual ya comenté algunas cosas en <a href="http://bosqueviejo.net/wordpress/2009/03/05/couchdb-rest-y-base-de-datos-documental/">otro artículo</a>.</li>
<li><a href="http://www.oracle.com/">Oracle 7</a>: y superiores.</li>
<li><a href="">Microsoft SQL Server 2005</a>: y superiores. El soporte es opcional, se pueden configurar los niveles de <em>aislamiento</em> (isolation) para poder usar MVCC o no.</li>
<li><a href="">MySQL</a>: a través de InnoDB o Falcon, pero se usa nivel de bloqueo por fila, en lugar de <em>snapshot</em>.</li>
</ul>
<p>Más información:</p>
<ul>
<li><a href="http://www.postgresql.org/docs/current/static/mvcc.html">PostgreSQL 8.3: Concurrency Control</a></li>
<li><a href="http://www.epx.com.br/artigos/arqtrans2_en.php">MVCC and snapshot-capable database &#8211; Do It Yourself</a></li>
<li><a href="http://enriqueplace.blogspot.com/2006/02/postgresql-la-base-de-datos-empez.html">PostgreSQL: ¿la base de datos empezó a consumir exageradamente espacio de disco? (actualizado)</a></li>
<li><a href="http://www.oracle.com/technology/oramag/oracle/05-nov/o65asktom.html">On Transaction Isolation Levels</a></li>
<li><a href="http://postgresql-in.blogspot.com/2008/04/postgresql-mvcc-and-vacuum.html">PostgreSQL MVCC and VACUUM</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2009/03/13/mvcc-control-de-concurrencia-para-multiples-versiones-de-postgresql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CouchDB: REST y Base de datos documental</title>
		<link>http://bosqueviejo.net/2009/03/05/couchdb-rest-y-base-de-datos-documental/</link>
		<comments>http://bosqueviejo.net/2009/03/05/couchdb-rest-y-base-de-datos-documental/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 09:03:48 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[base de datos documental]]></category>
		<category><![CDATA[couchdb]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[rest]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/wordpress/?p=105</guid>
		<description><![CDATA[Tal y como comentaba en otro artículo anterior, el sistema REST permite un acceso a los datos basado en la mezcla entre localizaciones de elementos (URL) y verbos de HTTP para indicar lo que se desea hacer con ese elemento. Eso, agregando un almacén de datos que permita albergar elementos y otras características añadidas, nos dan como resultado CouchDB.
El sistema de CouchDB, además de destacar como base de datos documental, cuya definición, extraída de la Wikipedia, viene a decir:

Permiten la indexación a texto completo, y en líneas generales realizar búsquedas más potentes. Tesaurus es un sistema de índices optimizado para este tipo de bases de datos.

Este sistema está altamente indicado para proyectos del tipo:

Buscadores, ya que se pueden almacenar webs y después hacer búsquedas en texto de forma eficiente.
Bitácoras, blogs, weblogs&#8230;; donde el almacenamiento de artículos o extensos textos, puede ser indizado y manejado para realizar las búsquedas.
Almacenes de libros, documentos y otros textos que puedan escribirse, sobre todo en formatos de texto plano, como pueden ser HTML, XML (Docbook, DITA, &#8230;), SGML, TXT, LaTeX, &#8230;

A esto sumamos que el transporte se realiza mediante HTTP, por la convención establecida mediante REST, y tenemos un sistema fácil de implementar y que [...]]]></description>
			<content:encoded><![CDATA[<p>Tal y como comentaba en <a href="http://bosqueviejo.net/wordpress/2009/02/23/rest-representational-state-transfer/">otro artículo anterior</a>, el sistema REST permite un acceso a los datos basado en la mezcla entre localizaciones de elementos (URL) y verbos de HTTP para indicar lo que se desea hacer con ese elemento. Eso, agregando un almacén de datos que permita albergar elementos y otras características añadidas, nos dan como resultado <a href="http://couchdb.apache.org/">CouchDB</a>.</p>
<p>El sistema de CouchDB, además de destacar como <a href="http://es.wikipedia.org/wiki/Base_de_datos#Bases_de_datos_documentales">base de datos documental</a>, cuya definición, extraída de la <a href="http://es.wikipedia.org/">Wikipedia</a>, viene a decir:</p>
<blockquote><p>
<em>Permiten la indexación a texto completo, y en líneas generales realizar búsquedas más potentes. Tesaurus es un sistema de índices optimizado para este tipo de bases de datos.</em>
</p></blockquote>
<p>Este sistema está altamente indicado para proyectos del tipo:</p>
<ul>
<li>Buscadores, ya que se pueden almacenar webs y después hacer búsquedas en texto de forma eficiente.</li>
<li>Bitácoras, blogs, weblogs&#8230;; donde el almacenamiento de artículos o extensos textos, puede ser indizado y manejado para realizar las búsquedas.</li>
<li>Almacenes de libros, documentos y otros textos que puedan escribirse, sobre todo en formatos de texto plano, como pueden ser HTML, XML (Docbook, DITA, &#8230;), SGML, TXT, LaTeX, &#8230;</li>
</ul>
<p>A esto sumamos que el transporte se realiza mediante HTTP, por la convención establecida mediante REST, y tenemos un sistema fácil de implementar y que soporta la carga que supone transmitir todos los documentos almacenados de una forma eficiente.</p>
<p>Cabe destacar que, aunque sea una base de datos documental y esté basada en el almacenamiento de documentos en campos de texto grandes, también se pueden almacenar otros tipos de datos y crear &#8220;tablas&#8221; a modo de tener un formato relacional, donde el documento juegue el papel principal, claro.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2009/03/05/couchdb-rest-y-base-de-datos-documental/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

