<?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>Tue, 08 May 2012 14:40:56 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>UUID: Identificador Único Universal</title>
		<link>http://bosqueviejo.net/2012/04/26/uuid-identificador-unico-universal/</link>
		<comments>http://bosqueviejo.net/2012/04/26/uuid-identificador-unico-universal/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 05:00:12 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[md5]]></category>
		<category><![CDATA[rfc4122]]></category>
		<category><![CDATA[sha-1]]></category>
		<category><![CDATA[uuid]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1333</guid>
		<description><![CDATA[ Últimamente, cada más sistemas, y cada más sitios emplean algo llamado UUID, cuyas siglas vienen a decir: Universally Unique ID; aunque suene algo arrogante, el cálculo de un UUID casi que podríamos decir que garantiza el que sea único. Es más, su grado de colisión es tan bajo que si lo colocásemos como identificador de clave primaria de una tabla que alberga elementos recogidos aleatoriamente de otras tablas de bases de datos de todo el mundo, que hayan empleado este tipo de dato, garantizamos que no habrá repetidos.
Suena excitante, pero&#8230;
¿Cómo funciona esto?
Referenciado en el RFC 4122 del IETF, el UUID se puede definir como un número de 16 bytes (128-bits) que se representa por 32 dígitos hexadecimales, mostrados en cinco grupos separados por guiones:

12345678-abcd-1b3d-a2c4-0123456789ab

Cada uno de los cinco grupos identifica un dato específico para garantizar su carácter único. En principio, se toma el timestamp de la hora actual con precisión de 100 nanosegundos y en formato UTC desde el 15 de octubre de 1582 (la fecha de la reforma gregoriana para el calendario cristiano) de la siguiente forma:

time_low el campo bajo del timestamp, este ocupa los primeros 32 bits.
time_mid el campo medio del timestamp, ocupa los siguientes 16 bits.
time_high [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/real_id_blanco-150x150.jpg" alt="" title="real_id_blanco" width="150" height="150" class="alignleft size-thumbnail wp-image-1334" /> Últimamente, cada más sistemas, y cada más sitios emplean algo llamado UUID, cuyas siglas vienen a decir: <em>Universally Unique ID</em>; aunque suene algo arrogante, el cálculo de un UUID casi que podríamos decir que garantiza el que sea único. Es más, su grado de colisión es tan bajo que si lo colocásemos como identificador de clave primaria de una tabla que alberga elementos recogidos aleatoriamente de otras tablas de bases de datos de todo el mundo, que hayan empleado este tipo de dato, garantizamos que no habrá repetidos.</p>
<p>Suena excitante, pero&#8230;</p>
<h3>¿Cómo funciona esto?</h3>
<p>Referenciado en el <a href="http://tools.ietf.org/html/rfc4122">RFC 4122</a> del <a href="http://www.ietf.org/" tooltip="Internet Engineering Task Force">IETF</a>, el UUID se puede definir como un número de 16 bytes (128-bits) que se representa por 32 dígitos hexadecimales, mostrados en cinco grupos separados por guiones:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">12345678-abcd-1b3d-a2c4-0123456789ab</pre></div></div>

<p>Cada uno de los cinco grupos identifica un dato específico para garantizar su carácter único. En principio, se toma el timestamp de la hora actual con precisión de 100 nanosegundos y en formato UTC desde el 15 de octubre de 1582 (la fecha de la reforma gregoriana para el calendario cristiano) de la siguiente forma:</p>
<ul>
<li><strong>time_low</strong> el campo bajo del timestamp, este ocupa los primeros 32 bits.</li>
<li><strong>time_mid</strong> el campo medio del timestamp, ocupa los siguientes 16 bits.</li>
<li><strong>time_high</strong> la última parte del timestamp, este no ocupa todo el grupo, sino solo los bits de menor peso, los primeros 12 bits.</li>
</ul>
<p>Para llegar a los primeros 64 bits nos faltan 4, esto es porque estos se emplean para identificar la versión de UUID que se emplea, según el RFC4122, de momento se contemplan 5:</p>
<ol>
<li>Versión basada en tiempo. Especificada en el RFC4122.</li>
<li>Versión de Seguridad DCE con UIDs POSIX embebidos.</li>
<li>Versión basada en nombre que usa MD5 (también se especifica en el RFC4122).</li>
<li>Versión aleatoria o pseudo-aleatoria de generación (también se especifica en el RFC4122).</li>
<li>Versión basada en nombre que usa SHA-1 (también se especifica en el RFC4122).</li>
</ol>
<p>El 4º campo se divide en dos, pero para un mismo concepto, que es la secuencia de reloj. Se escribe con datos de 8 bits especificando el de mayor y menor peso, quedando en este orden almacenados en el cuarto grupo. Aunque el grupo ocupa 16 bits, las versiones 3, 4 y 5 lo emplean como un dato de 14 bits, siendo en las versiones 3 y 5 una secuencia de reloj construida desde un nombre, y en la versión 4 una secuencia de reloj aleatoria o pseudo-aleatoria.</p>
<p>El 5º grupo es denominado <em>el nodo</em>. Ocupa 48 bits. En la versión 1 de UUID este dato se corresponde con la dirección MAC (dirección física de una interfaz de red) definida en el IEEE 802. Para equipos sin interfaz de red, se emplea un dato aleatorio o pseudo-aleatorio. Para las versiones 3 y 5 de UUID, este dato cambio construyéndose a través de una elección de nombre y codificándola con MD5 o SHA-1. Para la versión 4, este dato se construye a través de un número aleatorio o pseudo-aleatorio.</p>
<h3>Conclusiones</h3>
<p>Los UUID son identificadores únicos y muy difíciles de que se produzcan dos iguales dados los parámetros que se emplean para su generación. Al igual que los datos que se emplean para la generación del <em>conference ID</em> de la comunicación de H.323, este dato puede ser empleado como identificador de tablas y estar seguro que, aunque la tabla esté fraccionada y después se mezcle en una, los datos no colisionarán nunca.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2012/04/26/uuid-identificador-unico-universal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cassandra: la NoSQL de facebook</title>
		<link>http://bosqueviejo.net/2012/04/25/cassandra-la-nosql-de-facebook/</link>
		<comments>http://bosqueviejo.net/2012/04/25/cassandra-la-nosql-de-facebook/#comments</comments>
		<pubDate>Wed, 25 Apr 2012 05:00:42 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[cassandra]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1328</guid>
		<description><![CDATA[ Tras haber visto Riak un poco más de cerca, ahora le toca el turno a Cassandra. Esta base de datos NoSQL fue desarrollada en el seno de Facebook, como una de sus 7 tecnologías clave. En 2008 fue donada a Apache y desde entonces su popularidad ha ido creciendo cada vez más.
La ventaja de Cassandra es su capacidad de escalar a través de una configuración de anillo en un cluster. La información de la base de datos se distribuye entre todos los nodos configurados y puede ser accedida desde cualquiera de ellos. En este caso, la distribución es muy parecida a Riak, incluso emplean el mismo protocolo para intercomunicación entre nodos: Gossip; además, se requiere de generar un token especial balanceado para la configuración de cada nodo de Cassandra. En esta página hay un código escrito en Python para poder hacer esta tarea.
El acceso a la base de datos se realiza mediante RPC y usando Thrift, que representa otra de las 7 tecnologías clave de Facebook, y también liberada como software libre. Como Thrift es multi-lenguaje, está implementado en muchos de los lenguajes existentes, no hay problemas de implementación, ya sea en Python, Perl, PHP, Java, Erlang, etc.
¿Es NoSQL?
En [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/cassandra-150x150.jpg" alt="" title="cassandra" width="150" height="150" class="alignleft size-thumbnail wp-image-1329" /> Tras haber visto <a href="/2012/04/24/riak-revisando-y-practicando/">Riak</a> un poco más de cerca, ahora le toca el turno a Cassandra. Esta base de datos NoSQL fue desarrollada en el seno de Facebook, como una de sus <a href="http://alt1040.com/2011/02/7-tecnologias-de-software-que-sostienen-a-facebook">7 tecnologías clave</a>. En 2008 fue donada a Apache y desde entonces su popularidad ha ido creciendo cada vez más.</p>
<p>La ventaja de Cassandra es su capacidad de escalar a través de una configuración de anillo en un cluster. La información de la base de datos se distribuye entre todos los nodos configurados y puede ser accedida desde cualquiera de ellos. En este caso, la distribución es muy parecida a Riak, incluso emplean el mismo protocolo para intercomunicación entre nodos: Gossip; además, se requiere de generar un token especial balanceado para la configuración de cada nodo de Cassandra. En <a href="http://wiki.apache.org/cassandra/GettingStarted">esta página</a> hay un código escrito en Python para poder hacer esta tarea.</p>
<p>El acceso a la base de datos se realiza mediante RPC y usando Thrift, que representa otra de las <a href="http://alt1040.com/2011/02/7-tecnologias-de-software-que-sostienen-a-facebook">7 tecnologías clave</a> de Facebook, y también liberada como software libre. Como Thrift es multi-lenguaje, está implementado en muchos de los lenguajes existentes, no hay problemas de implementación, ya sea en Python, Perl, PHP, Java, Erlang, etc.</p>
<h3>¿Es NoSQL?</h3>
<p>En un principio, usando la base de Thirft y las funciones estándar que podemos ver en cualquier documentación, podríamos decir que sí es <a href="/2010/05/04/nosql/">NoSQL</a>. Nos proveen de funciones para realizar un CRUD básico a través de la inserción, actualización, eliminación y obtención de datos desde la base de datos. No obstante, la búsqueda queda un poco en el aire, ya que para poder buscar por cualquiera de las columnas creadas, hay que prefijar un índice.</p>
<p>Vamos al principio para entenderlo mejor. Haciendo una similitud con el modelo relacional, podemos ver que Cassandra dispone de los siguientes elementos:</p>
<ul>
<li><strong>Keyspace</strong>: debe de crearse un <em>keyspace</em> para almacenar la información y, a la hora de conectar, hay que indicar que <em>keyspace</em> se quiere utilizar. Esto es similar a lo que en las bases de datos tradicionales es la <em>base de datos</em> en sí.</li>
<li><strong>Column Family</strong>: la información se guarda en columnas dentro de la <em>keyspace</em>, pero se agrupan en familias para identificar la separación entre un conjunto de datos y otro. Por lo tanto, dentro de las <em>keyspace</em> debemos de crear <em>column families</em>, lo que en las bases de datos tradicionales serían las <em>tablas</em>.</li>
<li><strong>Columnas</strong>: son cada una de las columnas que se agrupan bajo una familia, que se declaran con un tipo (para validación del dato) y con un nombre. Si se establece un índice sobre la misma, entonces se da la posibilidad de poder buscar utilizándola.</li>
</ul>
<p>Llegados a este punto, vemos diferencias con otras NoSQL, como por ejemplo Riak. Riak tiene <em>buckets</em> donde Cassandra tiene <em>keyspaces</em>. En Riak cada <em>bucket</em> almacena claves a las que se les asigna un valor&#8230; en Cassandra esto no existe, ya que la clave de Cassandra está un nivel más abajo, cuando ya se han definido las familias de columnas. Esto deja a Cassandra entre <em>dos mundos</em>.</p>
<h3>Entre SQL y NoSQL&#8230; CQL</h3>
<p>Para confirmarlo, Cassandra dispone de un lenguaje de consulta que hace posible el empleo del mismo para realizar búsquedas entre sus familias de columnas, sobre las columnas que se hayan definido (con índice, claro). Este lenguaje provee de las órdenes básicas para realizar inserciones, actualizaciones, eliminaciones y obtención de datos.</p>
<p>Es más, el lenguaje en sí es llamado CQL y, viendo su sintaxis se sabe el porqué de la similitud con SQL. Por ejemplo, si tenemos creada la familia de columnas <strong>contactos</strong>, con una columna llamada <strong>nombre</strong>, y otra <strong>telefono</strong>, podemos realizar la siguiente consulta:</p>

<div class="wp_syntax"><div class="code"><pre class="cql" style="font-family:monospace;">SELECT nombre, telefono FROM contactos</pre></div></div>

<p>En las nuevas versiones de Cassandra, además, se puede emplear, en lugar de <tt>cassandra-cli</tt> el nuevo <tt>cqlsh</tt>, que permite emplear los comandos en formato CQL para manejar el cluster y hacer consultas al mismo. Esto hace pensar que Cassandra se comienza a desplazar cada vez más hacia el modelo relacional, dejando el paradigma de clave-valor muy atrás.</p>
<p>No obstante, facilita el acceso a este tipo de base de datos, a sistemas tan potentes, como para mantener un conjunto de máquinas en activo, en un anillo balanceando peticiones y en modo maestro-maestro con cada nodo.</p>
<h3>Conclusiones</h3>
<p>Después de darle bastantes vueltas y emplearlo para un par de desarrollos, he encontrado Cassandra bastante potente para el desarrollo de aplicaciones en las que la información se mantiene estática y se puede capturar de forma fácil a través de sus claves. Es muy rápido dando la información y él mismo balancea entre los nodos que tenga configurado.</p>
<p>Una nota negativa puede ser el hecho de que la búsqueda de información se hace bastante dificultosa debido a que, los datos de las columnas tienen que estar prefijados y muchos datos, en el enlace con Thrift, no funcionan bien. Así mismo, el filtrado por cualquier campo obliga a crear un índice sobre ese campo, lo que conlleva más ocupación de espacio y ralentizar un poco las inserciones, modificaciones y eliminaciones.</p>
<p>En definitiva, es una base de datos con capacidad fácil para montarse en forma de cluster, que permite una rápida ingesta de datos (siempre que tengan un formato prefijado), y una consulta también rápida de los mismos. No es indicado para sistemas en los que las consultas se puedan complicar, ya que requiere en ese caso de la creación de muchos índices e incluso muchas tablas intermedias para no perder la pista de la información. Al final, la mayoría de código hay que ejecutarlo del lado del cliente, por lo que cuanto más difícil sea el esquema de datos, más lento se volverá.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2012/04/25/cassandra-la-nosql-de-facebook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Riak: revisando y practicando</title>
		<link>http://bosqueviejo.net/2012/04/24/riak-revisando-y-practicando/</link>
		<comments>http://bosqueviejo.net/2012/04/24/riak-revisando-y-practicando/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 12:13:18 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[basho]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[mapreduce]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[riak]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1287</guid>
		<description><![CDATA[ Después de la introducción que hice ya hace unos meses sobre la teoría en la que se fundamenta esta base de datos, me he dispuesto a someterla a unas pruebas de funcionamiento, para así aprender a manejar de forma apropiada esta herramienta.
En principio, como revisé solo los conceptos en los que se basa y no el funcionamiento a nivel de usuario, de programador, no sabía si era una interfaz amigable para realizar consultas o búsquedas, y la forma de realizar las cargas, inserciones y demás. Tengo que decir que, al menos el acceso y la comunicación con el servidor resulta muy cómoda y sencilla, ya que se basa en REST.
A través de peticiones HTTP muy sencillas y que se pueden generar incluso desde la línea de comandos con herramientas como curl, podemos realizar peticiones a la base de datos. 
Mensajes hacia Riak
En principio, Riak se basa en REST, esto quiere decir que cada URI especifica un recurso dentro de la base de datos, y sobre ese recurso podemos realizar las acciones HTTP que se relacionan a cualquiera de las acciones básicas de una petición:

GET equivale a tomar datos, sería la R del CRUD (retrieve) o el SELECT del SQL.
PUT [...]]]></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" /> Después de la <a href="/2011/09/14/riak-base-de-datos-sin-spof/">introducción que hice ya hace unos meses</a> sobre la teoría en la que se fundamenta esta base de datos, me he dispuesto a someterla a unas pruebas de funcionamiento, para así aprender a manejar de forma apropiada esta herramienta.</p>
<p>En principio, como revisé solo los conceptos en los que se basa y no el funcionamiento a nivel de usuario, de programador, no sabía si era una interfaz amigable para realizar consultas o búsquedas, y la forma de realizar las cargas, inserciones y demás. Tengo que decir que, al menos el acceso y la comunicación con el servidor resulta muy cómoda y sencilla, ya que se basa en REST.</p>
<p>A través de peticiones HTTP muy sencillas y que se pueden generar incluso desde la línea de comandos con herramientas como <tt>curl</tt>, podemos realizar peticiones a la base de datos. </p>
<h3>Mensajes hacia Riak</h3>
<p>En principio, Riak se basa en REST, esto quiere decir que cada URI especifica un recurso dentro de la base de datos, y sobre ese recurso podemos realizar las acciones HTTP que se relacionan a cualquiera de las acciones básicas de una petición:</p>
<ul>
<li>GET equivale a tomar datos, sería la R del CRUD (retrieve) o el SELECT del SQL.</li>
<li>PUT equivale a insertar datos nuevos, sería la C del CRUD (create) o el INSERT del SQL.</li>
<li>POST equivale a una modificación o actualización de datos, sería la U del CRUD (update) o el UPDATE de SQL.</li>
<li>DELETE equivale a una eliminación del dato, sería la D (delete) o el DELETE de SQL.</li>
</ul>
<p>Esto permite muchas ventajas, como el uso, en el GET, de la cabecera <em>If-Modified-Since</em>, que nos dará la posibilidad de comprobar si un elemento pesado (imagen, vídeo o similar) es nuevo o no, para volver a descargarlo. Riak nos retornará el objeto con el mensaje 200 para indicar que hay uno nuevo, o solo la cabecera 304 (Not Modified) para indicarnos de que es el mismo que ya tenemos, por lo que no hace falta volver a transmitirlo.</p>
<p>Ante una petición de POST, o una de PUT en el que no exista el registro, se retornará el mensaje 201 (Created), y ante una operación de DELETE, si ha salido bien recibiremos un 204 (No Content) o 404 (Not Found).</p>
<h3>Composición de la URI</h3>
<p>La URI para localizar recursos dentro de Riak se puede establecer como sigue:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">/riak/BUCKET/RESOURCE</pre></div></div>

<p><strong>NOTA</strong>: la palabra clave <em>riak</em> ha sido modificada en nuevas versiones por <em>buckets</em>, pero se mantiene <em>riak</em> por compatibilidad hacia atrás. Por lo que, si estás instalando una versión nueva tomada de la parte de descargas de Riak, puedes usar en lugar de <em>riak</em> la palabra <em>buckets</em>.</p>
<p>Riak configura su URI de modo que la primera palabra clave es precisamente <em>riak</em>, seguida por el <em>bucket</em> donde se almacenarán los recursos que se indique a continuación en la URI. El bucket es un <em>bolsillo</em> en el que se puede almacenar lo que se desee. Además, el <em>bucket</em> se puede configurar a través del paso de algunos parámetros de configuración específicos. Esto se sale un poco del objetivo del artículo, por lo que si tienes curiosidad de lo que se puede configurar puedes echarle un vistazo a <a href="http://wiki.basho.com/HTTP-Set-Bucket-Properties.html">este enlace</a>.</p>
<p>Volviendo al tema, tenemos recursos. Estos recursos son un espacio en el que podemos guardar la información que necesitemos. Puede ser un texto normal, codificado como YAML, como JSON, como XML, o incluso una imagen o un vídeo&#8230; o incluso una imagen ISO (comprobado con una ISO de Sabayon de 700 MB aproximadamente).</p>
<p>Por lo que, podemos probar a hacer algunas prácticas. Lanzamos Riak. Si lo tenemos en ejecución en el puerto 8098 (es el de por defecto cuando se instala el paquete <em>deb</em>), podemos hacer lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">curl -v -X PUT -H &quot;Content-type: image/jpeg&quot; --data-binary @imagen.jpg http://127.0.0.1:8098/riak/pruebas/imagen.jpg</pre></div></div>

<p><strong>Nota</strong>: asegúrate de que la localización de la imagen es correcta, a una imagen de tu disco válida, y no olvidas poner la arroba (@) justo antes de esa ruta (sin espacios).</p>
<p>La comprobación más simple es a través del cualquier navegador que tengas instalado en esa misma máquina:</p>
<p><a href="http://127.0.0.1:8098/riak/pruebas/imagen.jpg">http://127.0.0.1:8098/riak/pruebas/imagen.jpg</a></p>
<p>Con esto ya tendríamos la primera pureba satisfactoria de nuestro sistema de clave-valor para el almacenamiento de datos. Ahora, si lo que queremos es eliminarla, podemos hacerlo así:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">curl -v -X DELETE http://127.0.0.1:8098/riak/pruebas/imagen.jpg</pre></div></div>

<p>Si recargamos el navegador con la URL anterior, veremos que nos responde <tt>not found</tt>.</p>
<h3>Búsquedas en Riak</h3>
<p>En caso de que tengamos información formateada en JSON dentro de cada clave y queramos hacer una búsqueda de esta información para extraer únicamente las claves que nos sean útiles, tendremos que emplear el sistema conocido como <em>map-reduce</em>, para realizar una búsqueda a través de todas las claves de un <em>bucket</em>.</p>
<p>Voy a basarme en lo explicado en la <a href="http://wiki.basho.com/Loading-Data-and-Running-MapReduce-Queries.html">documentación oficial de Riak</a>, para no tener que inventar datos. En principio, si descargamos los dos siguientes ficheros y los ejecutamos:</p>
<ul>
<li><a href="http://wiki.basho.com/attachments/goog.csv">goog.csv</a>, datos a insertar en Riak (en formato CSV).</li>
<li><a href="http://wiki.basho.com/attachments/load_data">load_data</a>, script en Erlang que insertará los datos, convirtiéndolos en un formato JSON. Hay que editar el scirpt y cambiar la URL para que tenga el puerto correcto, en mi caso puse 8098.</li>
</ul>
<p>Esto nos da un <em>bucket</em> bastante grande en el que poder practicar.</p>
<p>Como decíamos antes, vamos a dar un repaso al sistema de MapReduce, el cual fue popularizado por Google. Este se basa en el algoritmo de divide y vencerás, realmente, ya que realiza un lanzamiento sobre cada elemento individual (<em>map</em>) tomando un resultado y, después, la parte de <em>reduce</em>, se encarga de analizar y unificarlo todo en un solo resultado.</p>
<p>Por lo tanto, tenemos que enviar mediante POST, a una URI concreta, un formato JSON de dato que será el siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;inputs&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;goog&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;query&quot;</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
    <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;map&quot;</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #3366CC;">&quot;language&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;javascript&quot;</span><span style="color: #339933;">,</span>
        <span style="color: #3366CC;">&quot;source&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;function(value, keyData, arg) { var data = Riak.mapValuesJson(value)[0]; if(data.High &amp;&amp; parseFloat(data.High) &gt; 600.00) return [value.key]; else return []; }&quot;</span><span style="color: #339933;">,</span>
        <span style="color: #3366CC;">&quot;keep&quot;</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#125;</span></pre></div></div>

<p>Si guardamos esto en un fichero, podemos lanzarlo con el siguiente comando:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">curl -X POST http://127.0.0.1:8098/mapred -H &quot;Content-type: application/json&quot; -d @mapred.json</pre></div></div>

<p>En este caso, la función de <em>map</em> es la siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>value<span style="color: #339933;">,</span> keyData<span style="color: #339933;">,</span> arg<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">var</span> data <span style="color: #339933;">=</span> Riak.<span style="color: #660066;">mapValuesJson</span><span style="color: #009900;">&#40;</span>value<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>data.<span style="color: #660066;">High</span> <span style="color: #339933;">&amp;&amp;</span> data.<span style="color: #660066;">High</span> <span style="color: #339933;">&gt;</span> <span style="color: #CC0000;">600.00</span><span style="color: #009900;">&#41;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#91;</span>value.<span style="color: #660066;">key</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">else</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Esto quiere decir que se toma el contenido de cada clave, se parsea con una función especial de Riak para convertir de JSON y retornar la primera línea para que sea almacenada en <tt>data</tt>. Se comprueba que tenga campo <em>High</em> y que <em>High</em> sea mayor de 600.</p>
<p>Es un filtro como se puede hacer con cualquier función <em>map</em> en cualquier lenguaje (que disponga de ella, claro).</p>
<p>Ahora, para emplear tanto <em>map</em>, como <em>reduce</em>, imagina que lo que queremos, de esta información, es econtrar la máxima varianza diaria del precio por mes. Para eso, en el <em>map</em> sacaríamos la varianza diaria, y en el <em>reduce</em> tomaríamos solo la máxima varianza por mes, las funciones serían así:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/* Map calcula la varianza diaria y asigna la clave por mes */</span>
<span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>value<span style="color: #339933;">,</span> keyData<span style="color: #339933;">,</span> arg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">var</span> data <span style="color: #339933;">=</span> Riak.<span style="color: #660066;">mapValuesJson</span><span style="color: #009900;">&#40;</span>value<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #003366; font-weight: bold;">var</span> month <span style="color: #339933;">=</span> value.<span style="color: #660066;">key</span>.<span style="color: #660066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'-'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">slice</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">join</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'-'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  obj<span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> data.<span style="color: #660066;">High</span> <span style="color: #339933;">-</span> data.<span style="color: #660066;">Low</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#91;</span> obj <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009966; font-style: italic;">/* Reduce encuentra la varianza máxima por mes */</span>
<span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>values<span style="color: #339933;">,</span> arg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#91;</span> values.<span style="color: #660066;">reduce</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>acc<span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
             <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> month <span style="color: #000066; font-weight: bold;">in</span> <span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                 <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>acc<span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> acc<span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>acc<span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;</span> <span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> acc<span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
                 <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span> acc<span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
             <span style="color: #009900;">&#125;</span>
             <span style="color: #000066; font-weight: bold;">return</span> acc<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
         <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Codificado para enviarlo en el fichero <tt>mapred.json</tt>, lo anterior quedaría así:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;inputs&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;goog&quot;</span><span style="color: #339933;">,</span>
 <span style="color: #3366CC;">&quot;query&quot;</span><span style="color: #339933;">:</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;map&quot;</span><span style="color: #339933;">:</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;language&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;javascript&quot;</span><span style="color: #339933;">,</span>
                  <span style="color: #3366CC;">&quot;source&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;function(value, keyData, arg){ var data = Riak.mapValuesJson(value)[0]; var month = value.key.split('-').slice(0,2).join('-'); var obj = {}; obj[month] = data.High - data.Low; return [ obj ];}&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
         <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;reduce&quot;</span><span style="color: #339933;">:</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;language&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;javascript&quot;</span><span style="color: #339933;">,</span>
                    <span style="color: #3366CC;">&quot;source&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;function(values, arg){ return [ values.reduce(function(acc, item){ for(var month in item){ if(acc[month]) { acc[month] = (acc[month] &lt; item[month]) ? item[month] : acc[month]; } else { acc[month] = item[month]; } } return acc;  }) ];}&quot;</span><span style="color: #339933;">,</span>
                    <span style="color: #3366CC;">&quot;keep&quot;</span><span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
         <span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>NOTA</strong>: el parámetro <em>keep</em> es el que nos dice qué es lo que se retorna. Si agregamos este mismo parámetro en las dos secciones (<em>map</em> y <em>reduce</em>), nos encontramos que el retorno de la búsqueda es tanto de uno como de otro.</p>
<h3>Otras cosas</h3>
<p>Otra de las cosas que han agregado es la posibilidad de enlazar recursos, de modo que, asignando un enlace y una etiqueta (con el nombre del tipo de enlace), podamos tener relacionado un recurso con otro. Esto da un abanico de posibilidades tan grande como el que se consigue con las bases de datos relacionales, ya que es posible tener en un <em>bucket</em> contactos, en otro datos específicos de un servicio y relacionar el contacto con esos datos agregando una etiqueta al mismo, e incluso que el enlace sea bidireccional agregando las etiquetas en los dos sentidos, cambiando la etiqueta para que sea semántica.</p>
<p>Una imagen de lo que se puede conseguir:</p>
<p><a href="http://bosqueviejo.net/wp-content/uploads/circle-of-friends.png"><img src="http://bosqueviejo.net/wp-content/uploads/circle-of-friends-300x163.png" alt="" title="circle-of-friends" width="300" height="163" class="aligncenter size-medium wp-image-1347" /></a></p>
<p>Las partes de administración (para ajustar las variables del <a href="http://es.wikipedia.org/wiki/Teorema_CAP">teorema CAP</a>) y configuración de otros nodos es algo que dejamos a revisar de la <a href="http://wiki.basho.com/What-is-Riak%3F.html">documentación oficial</a>.</p>
<h3>Conclusiones</h3>
<p>Como puede verse, Riak solventa con su paradigma de NoSQL, basado en el almacenamiento por clave-valor y búsquedas por MapReduce, la mayoría de necesidades que se pueden encontrar a la hora de emplear este tipo de sistemas. Lo único que queda un poco en el aire, o hay que realizar con llamadas sucesivas, son las actualizaciones y eliminaciones masivas, pero realmente, puede ser un mal menor, si estas no son empleadas en el esquema que se vaya a implementar Riak.</p>
<p>Hay que tener presente que Riak es una muy buena base de datos, que fundamenta sus potencias en la posibilidad de contar con un cluster, lecturas rápidas con caché, y búsquedas artificiosas con <em>MapReduce</em>, pero puede haber otros usos en los que las consultas de modificación y eliminación masivas sean lo más importante y esto ya sería mejor abarcarlo con otra base de datos de otro tipo.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2012/04/24/riak-revisando-y-practicando/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>1</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 <a href="http://es.wikipedia.org/wiki/Teorema_CAP">teorema CAP</a> 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>
	</channel>
</rss>

