Estamos utilizando MySQL para almacenar datos sin esquema (vea: Using a Relational Database for Schemaless Data para la solución inspirada en cómo FriendFeed usa MySQL para almacenar datos sin esquema).Serialización con búferes de protocolo en una base de datos sin esquema
Una mesa grande lleva a cabo todas las entidades para nuestra aplicación:
CREATE TABLE entities (
added_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
, id BINARY(16) NOT NULL
, body MEDIUMBLOB
, UNIQUE KEY (id)
) ENGINE=InnoDB ;
algunos detalles:
La propiedad sólo se requiere de las entidades almacenado es
id
, un UUID de 16 bytes. El resto de la entidad es opaco para la base de datos. Podemos cambiar el "esquema" simplemente almacenando nuevas propiedades en elbody
.La columna
added_id
está presente porque InnoDB almacena las filas de datos físicamente en el orden de las teclas principales. La clave primaria AUTO_INCREMENT asegura que las nuevas entidades se escriban secuencialmente en el disco después de las entidades antiguas, lo que ayuda a la localización de lectura/escritura (las nuevas entidades se leen con más frecuencia que las entidades antiguas).Nuestra base de datos almacena nuestros datos sin esquema en el
body
. < - Este es el tema de esta pregunta.Un montón de otros detalles interesantes, como "llegar a" los datos
body
para construir asíncrono vistas materializadas (índices son sólo las tablas que se construyen fuera de línea), pero no son relevantes para la discusión actual ...
Cómo deberíamos serializar los datos estructurados (pares de clave y valor) en el body
?
JSON o BSON sería simple, ya que los nombres de los campos se repiten para cada fila. Esto le da una ventaja en flexibilidad pero también una gran desventaja en la eficiencia del espacio (una sobrecarga por fila para los nombres de campo en los datos serializados). Estamos tratando de mantener cosas en la memoria, y minimizar la memoria y la huella de la red es importante aquí. Cuantos más registros podamos incluir en el mismo espacio, más rápidas serán nuestras consultas. ¡Preferimos nombres de campo descriptivos relativamente largos, y acortarlos para hacer que mi base de datos sea más rápida es incorrecta!
Al final, JSON/BSON no es viable para nuestros propósitos, a menos que obtengamos más complejas y asignamos pequeñas claves a claves más descriptivas en el controlador de la aplicación que habla con la base de datos. Lo que nos hizo pensar ...
Aunque nuestra base de datos no tiene esquemas, en realidad: 1) no hay muchos tipos diferentes de entidades, 2) las versiones del mismo tipo de entidad no cambian a menudo, y 3) cuando cambian, generalmente es solo agregar otro campo. JSON/BSON no tiene soporte nativo para el control de versiones.
Los búfers de protocolo y de ahorro son mucho más sofisticados cuando se trata de versiones y cambios en la definición de datos. Ambos Thrift y Protocol Buffers son excelentes candidatos para serializar datos en bases de datos, y Thrift está diseñado para que el formato de codificación sea extensible.
Los búferes de protocolo parecen una excelente opción para serializar datos en una base de datos sin esquemas.
CouchDB y MongoDB (las dos bases de datos sin esquema más populares?) Usar JSON y BSON respectivamente, pero no podemos encontrar nada sobre el uso de algo más avanzado, como Protocol Buffers, como un formato de serialización para almacenar datos sin esquema. Hay productos que almacenan una versión de objetos de un idioma específico (es decir, almacenar objetos Externalizables de Java en una cuadrícula de datos, o hacer NoSQL con MySQL en Ruby), pero estos son un problema (intente acceder a ellos desde otras plataformas, o incluso desde MySQL, y olvídate de versionar).
¿Alguien está almacenando los Buffers de Protocolo más interoperables en su base de datos, o algún otro formato de serialización avanzada en su base de datos sin esquema? Se trata de si hay otras opciones aparte de la serialización por línea directa de JSON/BSON/XML o la serialización de los objetos de un idioma específico. ¿Es incluso factible? ¿Nos estamos perdiendo algo? disculpa por la narrativa del estilo de la corriente de la conciencia!
Gracias por la referencia de Friendfeed y los detalles en esta pregunta. Una cosa que noté es que Friendfeed no usó búferes de protocolo en su implementación MySQL sin esquema a pesar de que provenían de Google ... ¿Me pregunto por qué? Ha pasado un tiempo desde su publicación, simplemente preguntándose qué decidió hacer y cómo le resultó (especialmente si decidió usar memorias intermedias de protocolo). – TaiwanGrapefruitTea
Gracias. Tenía una pregunta muy similar, aunque era un poco más genérica: http://stackoverflow.com/questions/17441428/protocol-buffer-database-abstraction-framework. Espero que veamos algo que permita a los desarrolladores de sistemas diseñar esquemas más estrictos pero escalables en nuestras implementaciones de NoSQL. Protocol Buffers parece un muy buen comienzo para diseñar la definición de esquema y los mecanismos de control de versiones. –