7

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 el body.

  • 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!

+0

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

+0

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. –

Respuesta

1

Es posible que desee buscar algo como Cassandra o HBase para almacenar sus datos. El problema con el blob de datos opacos es que no puede realizar consultas basadas en él con su esquema MySQL aquí. Si estás buscando algo, deberás leer en cada blob y verificarlo. Si eso no es importante para la forma en que realiza las búsquedas (es decir, siempre la tecla), le sugiero que utilice los búferes de protocolo para serializar los datos, posiblemente comprimiendo con compresión zlib o LZO.

Los búferes de protocolo le permiten crear una estructura de datos simple que puede aceptar campos adicionales a medida que sus datos evolucionan. Los nombres de campo se almacenan como números y el código para trabajar con las estructuras se genera automáticamente desde su archivo .proto. El rendimiento es bueno y los tamaños de datos se mantienen bastante pequeños. Se podría comprimir opcionalmente los datos, ya sea utilizando la compresa MySQL() o una de las bibliotecas de compresión en tiempo real que se resumen aquí (no sólo de Java):

Fast compression in Java?

Espero que esto ayude.

+0

Ha declarado que Cassandra/HBase no son opciones válidas. – Pacerier

+0

Él solo indicó que CouchDB y MongoDB estaban fuera debido a su uso de JSON/BSON. Su investigación de las tecnologías NoSQL implica la voluntad de cambiar si los beneficios son apropiados. –

+0

Realmente no. Él quiere construir una solución sin esquema sobre un robusto RDBMS, también conocido como NoSQL con MySQL. Lea toda la pregunta y revise los enlaces vinculados. – Pacerier

3

Como se enteró, MongoDB y CouchDB tienen buenas opiniones sobre cómo almacenar sus datos. Si está buscando un enfoque de almacenamiento independiente, querrá hacer algo como lo sugiere @Joshua y mirar a Cassandra o HBase. Incluso estas dos áreas de almacenamiento de datos tienen opiniones sobre cómo se deben almacenar los datos (ambos se basan en Google's Bigtable) y almacenan datos en column families.

Riak utiliza búferes de protocolo como un método para serializar los datos de su aplicación en el almacén de datos. Puede valer la pena comprobar si se ajusta a sus necesidades. Parece que en gran medida está planeando hacer búsquedas de claves individuales, por lo que Riak puede ser un fuerte candidato para su solución.

+1

Por favor, lea la pregunta. Él está preguntando cómo hacerlo ** con MySQL **. – Pacerier

+0

No, no lo es, pero gracias por jugar. –

+0

Sí, él es. ¿Has leído el primer párrafo? – Pacerier

0

Lo referiré a una respuesta que presenté hace unos meses sobre una especie de tema similar. Nosotros usamos MySQL y un formato de texto personalizado que resultó ser más rápido que los formatos XML o JSON:

What scalability problems have you encountered using a NoSQL data store?

funcionando bien para nosotros. Sin embargo, no intenté Protocolos de protocolo.

+0

Probablemente esté utilizando un analizador JSON o XML incorrecto: los gastos generales con una buena impl deben ser lo suficientemente bajos para que los formatos personalizados no sean prácticos. – StaxMan

+0

No, no creo que lo hayamos hecho, creo sinceramente que nuestro problema específico fue más eficazmente abordado usando un formato personalizado. Eso tiene otras desventajas, pero el rendimiento por sí solo no era uno de ellos. – Brian

+0

Por curiosidad, ¿qué lengua/plataforma es esa? Mi experiencia es con Java. Y no estoy diciendo que el formato personalizado no pueda ser rápido (ciertamente puede), solo que es difícil ser significativamente más rápido. – StaxMan

Cuestiones relacionadas