2012-02-16 14 views
8

Digamos que estamos diseñando un nuevo sistema y hemos decidido utilizar MongoDB como base de datos primaria. El esquema de datos es muy similar a un blog con [creciente] comentarios.Rendimiento de MongoDB con una estructura de datos en crecimiento

En el libro "Desarrolladores de MongoDB", Consejo # 6: No incruste campos que tienen crecimiento independiente, dice que es ineficaz agregar datos constantemente al final de una matriz (pero también insinuó que los comentarios son un " caja de borde extraña ").

Digamos que nuestro nuevo sistema es como esos "comentarios" en un blog, creciendo dinámicamente todo el tiempo, pero a veces cambiando o borrándolos.

Entonces, habiendo reconocido que podría haber un problema de rendimiento con MongoDB, ¿qué otra base de datos alternativa (debe ser una base de datos escalable horizontalmente) podría servir para este propósito? . (No nos importa usando MongoDB como nuestra base de datos principal, pero separado los "comentarios" a una base de datos alternativa ¿Cuáles son las opciones disponibles

Notas:?

La característica de tener Redis hashes como sus tipos de datos encaja con la descripción de nuestra estructura de datos de "comentarios" - en constante crecimiento pero a veces modificada o eliminada - PERO no necesitamos una base de datos pura en memoria (no queremos dedicar tanta RAM cuando los datos pueden persistir en el disco)) - de lo contrario, esto sería una buena opción para nuestro problema

¿Qué pasa con el uso de CouchDB? No se investigó sobre este producto. ¿Cómo funciona con una estructura de datos en crecimiento?

Respuesta

5

Para agregar a lo que Thilo dijo anteriormente, la razón para "no incrustar campos que tienen crecimiento independiente" es porque este tipo de expansión de tamaño de documento puede hacer que MongoDB tenga que mover el documento si excede el espacio actual asignado . Puede leer más sobre esto en la sección Padding Factor de la documentación.

Esos tipos de movimientos son relativamente caros, especialmente si ocurren con frecuencia. Por lo tanto, limitar el tamaño (esencialmente limitando ese crecimiento) de los comentarios equivalentes en su colección principal (X más reciente, etc.) y tal vez rellenar previamente ese campo de documento (esencialmente relleno manual) para reducir los movimientos causados ​​por las adiciones/cambios de comentarios bien valdrá la pena por ti.

+0

Me molestó un poco el consejo original, me parece que querrías hacer esto en un documento db, de lo contrario volverás a un enfoque de tablas. ¿Sabes cuántas veces se tendrá que mover el documento si, por ejemplo, una matriz comienza en 0 y crece a 1000 (un elemento, por ejemplo, que se agrega una vez al día)? – UpTheCreek

+0

Si se trata de un conjunto de tamaños fijo o conocido, puede rellenarlo manualmente, llenarlo con datos falsos inicialmente y luego eliminar los datos falsos. Eso significaría que no desencadenaría un movimiento hasta que excediera ese límite.En términos de qué tan seguido ocurrirá de otra manera, debido a cómo se calcula el factor de relleno, eso depende del tamaño del documento y del uso de la colección (en función de una proporción de movimientos a operaciones sin movimiento) –

6

Puede quedarse con MongoDB, pero no incluir todos los comentarios en el documento principal, sino solo los más recientes (limitados por el número), y mantener el resto en una colección separada.

0

Parece que Mongo funcionaría bien para ustedes, simplemente mantengan los "comentarios" en un anuncio de recopilación separado opuesto a un sub elemento de otro documento, es decir, una página (continuando el ejemplo del blog).

En cuanto al rendimiento de Mongo, mientras esos índices puedan caber en el ariete, debería estar bien.

0

Su problema principal es que probablemente esté realizando actualizaciones y eliminando datos en diferentes páginas de memoria, lo que significa que no podrá actualizar de forma secuencial. En este caso, muchas bases de datos tendrán el mismo problema, por lo que cambiar de MongoDB no resolverá nada.

Cuestiones relacionadas