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 datosvoid 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 onull
si hay algún error. boolean crear - Si estrue
la base de datos será creada si no existe
JSONDB.drop()
// borra una base de datos o vistavoid 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 datosvoid 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 vistasvoid 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 problemasvoid 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 identificadorvoid 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 documentovoid Dbh.put ( obj, fn )
Dbh.delete()
// elimina un documentovoid Dbh.delete ( [string | obj], fn )
Dbh.all()
// lista elementos en la base de datos o vistavoid 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
No hay comentarios:
Publicar un comentario