04 mayo, 2009

JSONDB

Hace muy poco presenté Interactive CouchDB, un experimento para trabajar con una emulación de CouchDB en el navegador. También propuse crear un sistema alternativo de consulta sobre SQLite que aprovechase esa base de datos pero implementase un lenguaje de consulta más orientado a la idiosincrasia de JavaScript. Si bien, JSONDB no es exactamente una interfície a SQLite, sí que propone un lenguaje que aprovecha JSON y permite aprovechar la flexibilidad de JavaScript. Traduzco:

Por Lloyd Hilaiel

Estado

(En este momento, este documento es un hack, un trabajo en desarrollo, y no debe tomarse en serio. Si sobreestimas esto, dejarás de gustar a tus amigos, tu caballo huirá, y alguien podría robar tus limpiaparabrisas traseros).

Resumen

Conforme las tecnologías de los navegadores maduran y evolucionan, hemos visto una nueva horda de tecnologías y APIs disponibles para el Javascript basado en los navegadores. Un área en particular estado de fluidez es el almacenamiento en el lado del navegador o cliente. Las propuestas en HTML5 van desde el almacenamiento de clave/valor hasta el SQL en el cliente, y mientrastanto, varios fabricantes han empezado ya a implementar distintos mecanismos.

En la actualidad, SQL (y específicamente SQLite) ha sido el ganador de facto del debate sobre el almacenamiento en local. Varios expertos en la comunidad han expresado sus dudas sobre si SQL, aún siendo una elección robusta (dada la maravillosa y gratuita librería SQLite), es necesariamente la elección correcta.

Esta página es una especificación e una API de base de datos JSON para el navegador, que está basada principalmente en el trabajo realizado por el proyecto CouchDB. La meta de esta especificación es explorar una alternativa a SQL en el cliente.

Visión general

JSONDB propone una API asíncrona y un esquema para el almacenamiento orientado a documentos en el cliente. Mientras que JSONDB toma prestadas muchas ideas presentes en CouchDB, se han adaptado al entorno del cliente. Las siguientes características han sido propuestas:
  • Almacenamiento desestructurado, basado en documentos
  • soporte para cualquier número de bases de datos
  • ámbito de la base de datos limitado al dominio (p.e. darkness.com no puede acceder a los datos de light.org)
  • búsqueda de texto completo
  • sistema de vistas ligeras que facilitan un acceso ordenado a los datos

Los "documentos" no son más que objetos jerárquicos en Javascript. Los documentos pueden tener un tamaño y anidamiento arbitrarios. Todas las propiedades de documentos que empiecen con una barra baja _ están reservadas para su uso por la implementación de la base de datos. La propiedad _id de un documento especifica su identificador único. Un cliente podría establecer explícitamente su _id al añadir un documento a la base de datos, y que será utilizado si resulta ser único. En caso de que _id no esté definido, la base de datos asignará automáticamente un identificador a cada documento en cuanto sea guardado.

Las "vistas" son un mecanismo simple que hace posible la ordenación de documentos basada en elementos hijos específicos. Las vistas en JSONDB son mucho más simples (y menos potentes) que las de CouchDB.

JSONDB


JSONDB es un objeto global de javascript. Provee 5 métodos: open, drop, info, list y getView. El método JSONDB.open() devuelve (via una función callback aportada por el cliente) un manejador (handle) de base de datos (referido como Dbh en este documento). Un manejador de base de datos provee 4 métodos: get, put, delete, copy y all.

Métodos de gestión de la base de datos

JSONDB.open() // abre o crea una base de datos
void JSONDB.open ( nombre, fn, [ crear ] )
Parámetros:
string nombre - Nombre de la base de datos a crear
function fn - Función callback a la que se pasará un objeto si la llamada tiene éxito o null si hay algún error.
boolean crear - Si es true la base de datos será creada si no existe

JSONDB.drop() // borra una base de datos o vista
void JSONDB.drop ( nombre, [ fn ] )
Parámetros:
string nombre - El nombre de la base de datos o vista a eliminar
function fn - Función callback opcional a la que se pasará un boolean el resultado de la operación

JSONDB.info() // obtener información sobre una base de datos
void JSONDB.info ( nombre, fn )
Parámetros:
string nombre - El nombre de la base de datos de la que extraer información
function fn - Función callback a la que se pasará el objeto con la información solicitada

JSONDB.list() // muestra una lista con todas las bases de datos y vistas
void JSONDB.list ( fn )
Parámetros:
function fn - Función callback a la que se pasará una lista de cadenas con los nombres de las bases de datos disponibles

JSONDB.getView() // crea o abre una vista de base de datos. La vista existirá en el mismo espacio de nombres que las bases de datos, por lo que un nombre único es necesario. Esta función devolverá, mediante callback, un manejador o handle de sólo lectura (por los que los métodos .all() y .get() estarán disponibles, pero no así .put() ni .delete()) o bien devolverá null en caso de problemas
void JSONDB.getView ( nombre, base, clave, fn )
Parámetros:
string nombre - El nombre de la vista a recuperar o crear
string base - El nombre de la base de datos contra la que se creará esta vista
string clave - Un camino a la entidad usada como clave de ordenación
function fn - Función callback que recibirá una lista de cadenas con los nombres de las bases de datos disponibles

Métodos de gestión de documentos

Dbh.get() // obtiene un documento específico a partir de su identificador
void Dbh.get ( id, fn )
Parámetros:
string id - El identificador del documento a recuperar
function fn - Función ca[]llback

Dbh.put() // inserta o actualiza un documento
void Dbh.put ( obj, fn )

Dbh.delete() // elimina un documento
void Dbh.delete ( [string | obj], fn )

Dbh.all() // lista elementos en la base de datos o vista
void Dbh.all ( obj, fn )

Seguridad

Inicialmente cada dominio será un espacio de nombres (namespace) de forma que cada dominio tenga un conjunto privado de bases de datos en el navegador. Finalmente podría ser deseable relajar esta restricción, permitiendo algún mecanismo para la compartición segura de bases de datos entre dominios. Hay al menos dos casos distintos, primero cuando un sitio está dividido entre varios dominios, y segundo cuando se desee usar el almacenamiento en el cliente como una especie de cache para el intercambio de documentos entre dominios. Me parece curioso el segundo caso, pero no estaría interesado en el último.

Utilización de disco

Actualmente en HTML5 debe haber mecanismos incorporados para evitar un uso excesivo y no monitorizado del disco desde código javascript no verificado, y permitir que una aplicación especifique de antemano una estimación aproximada del espacio necesario para reducir el número de solicitudes de permiso al usuario para aumentos de tamaño.

Créditos

  • Leí por primera vez la idea de una base de datos JSON en el cliente en lugar de SQLite a Douglas Crockford hará un año.
  • La mayoría del diseño de esta especificación está inspirado por CouchDB.

Fuente: JSONDB

Publicar un comentario en la entrada

Últimos links en indiza.com