Como programador de bases de datos relacionales (la mayoría de las veces), leí artículos sobre cómo las bases de datos relacionales no se escalan, y las soluciones NoSQL como MongoDB lo hacen. Como la mayoría de las bases de datos que he desarrollado hasta ahora han sido de pequeña a mediana escala, nunca he tenido un problema que no haya sido resuelto por alguna indexación, optimización de consultas o rediseño de esquemas.
¿Qué tipo de tamaño esperaría ver con MySQL luchando? Cuantas filas
(Sé que esto dependerá de la aplicación y el tipo de datos almacenados. El que me consiguió era básicamente una base de datos de genética, por lo que tendría una tabla principal, con 3 o 4 tablas de búsqueda. La tabla principal contendrá entre otras cosas, una referencia cromosómica y una coordenada de posición. Probablemente se le preguntará por una cantidad de entradas entre dos pociones en un cromosoma, para ver qué se almacena allí).
fuente
Respuestas:
¿Qué tan grande es un dato?
Hay dos umbrales significativos:
Con las SSD rápidas, el primer umbral se convirtió en un problema menor, a menos que tenga mucho tráfico.
Acidez
Uno de los problemas con el escalado de RDBMS es que, por diseño, son ACID, lo que significa transacciones y bloqueos de nivel de fila (o incluso nivel de tabla en algunos RDBMS más antiguos / simples). Puede ser un factor limitante si tiene muchas consultas que modifican la gran cantidad de datos que se ejecutan al mismo tiempo. Las soluciones NoSQL suelen ir para el modelo de consistencia eventual
¿Cómo escala RDBMS en el tamaño de los datos?
No es del todo cierto que RDBMS no pueda escalar el tamaño de los datos, hay dos alternativas: partición vertical y partición horizontal (también conocido como fragmentación).
El particionamiento vertical consiste básicamente en mantener tablas no relacionadas en servidores de bases de datos separados, manteniendo así el tamaño de cada uno por debajo de los umbrales mencionados anteriormente. Esto hace que unir estas tablas con SQL simple sea menos directo y menos eficiente.
Sharding significa distribuir datos de una tabla entre varios servidores, en función de una clave específica. Esto significa que para las búsquedas sabes qué servidor consultar en función de esa clave. Sin embargo, esto complica las consultas que no son búsquedas en la clave de fragmentación.
En el caso de ambos tipos de particiones, si llega a extremos, básicamente termina con la misma situación que las bases de datos NoSQL.
fuente
No creo que el tamaño de los datos sea el único factor. El "modelo de datos" también es una parte muy importante.
Las páginas del catálogo de comercio electrónico (Solr, ElasticSearch), los datos de análisis web (Riak, Cassandra), los precios de las acciones (Redis), las conexiones de relaciones en las redes sociales (Neo4J, FleetDB) son solo algunos ejemplos cuando una solución NoSQL realmente brilla.
En mi humilde opinión, el modelo de datos tiene un papel más importante que el tamaño de los datos cuando se considera una solución NoSQL o RDBMS.
fuente
Si las bases de datos relacionales no se escalan, nada lo hace. No te preocupes por los problemas de escala.
SQL tiene problemas con algunos tipos de análisis, pero no se necesitan muchos datos para desencadenar el problema. Por ejemplo, considere una sola tabla con una columna que hace referencia a otras filas en función de una clave única. Por lo general, esto podría usarse para crear una estructura de árbol. Puede escribir sentencias SQL rápidas que hagan referencia a la fila relacionada. O la fila relacionada de la fila relacionada. De hecho, puedes hacer cualquier número específico de saltos. Pero si, para cada fila, desea seleccionar un campo en la primera fila relacionada en la cadena que cumpla algún criterio, entonces se complica.
Considere una tabla de ubicaciones de oficinas a nivel de nación, provincia / estado, condado, pueblo y aldea, con cada oficina haciendo referencia a la oficina a la que informa. No hay garantía de que la oficina de informes de cada oficina esté solo un nivel más arriba. Para un conjunto seleccionado de oficinas, no todas en un nivel, desea enumerar la oficina nacional asociada de cada uno. Esto requiere bucles de declaraciones SQL y llevará mucho tiempo incluso hoy. (Solía obtener 30 segundos en una selección de 30 oficinas, pero eso fue hace mucho tiempo, y cambiar a procedimientos almacenados ayudó un poco).
Entonces, la alternativa es poner toda la estructura en un gran bloque de datos, etiquetarlo y almacenarlo. Cuando desee analizar los datos, léalos todos en la memoria de una vez, configurando punteros para rastrear la estructura, y puede procesar un par de millones de oficinas en un abrir y cerrar de ojos.
Nada de esto tiene mucho que ver con la cantidad de datos. La clave es la naturaleza de la organización de los datos. Si un diseño relacional ayuda, entonces un RDBMS es lo que desea. Si no, algún tipo de almacenamiento a granel va a ser desde un poco hasta un billón de veces más rápido.
Tenga en cuenta que si uno de estos conjuntos de datos se vuelve demasiado grande para caber en la memoria, su base de datos que no sea SQL ya no funcionará. Otro problema es cuando necesita datos de más de un bloque a la vez; puede hacer esto si , y solo si, todos los bloques caben en la memoria a la vez. Y el usuario tiene que esperar mientras los carga.
Si su base de datos relacional le causará problemas, lo hará antes de que ingrese muchos datos. El único problema de escala que puede tener es con su programa cuando el bloque de datos que está ensamblando para un DB nosql, si tiene que usar uno, se vuelve demasiado grande para él. (Lea sobre errores de falta de memoria. Los idiomas más nuevos a veces hacen cosas extrañas con la memoria).
fuente
Creo que la primera razón para ir a una solución NoSQL o distribuida no es tanto el tamaño de todos los datos, sino el tamaño de las tablas. Lo que las soluciones distribuidas funcionan bien es dividir las tablas en diferentes nodos y luego, cuando necesite consultar las tablas, cada nodo procesará su parte de la tabla.
Los RDBMS pueden hacer esto, pero la nueva ola de bases de datos NoSQL se ha creado para hacerlo. Oracle, MSSQL, MySQL tomaron su modelo centralizado y lo modificaron para que funcione en un entorno distribuido. Sin embargo, todavía se adhieren a las estrictas reglas de ACID, mientras que algunas de las nuevas bases de datos no se adhieren a las reglas estrictas, como el uso de la coherencia eventual.
No hay una cantidad establecida de datos en la que deba elegir uno sobre el otro. Lo que debe tenerse en cuenta son las necesidades de la base de datos y la cantidad de uso que recibe. Las bases de datos NoSQL pueden procesar conjuntos de datos más grandes más rápidamente, mientras que las bases de datos relacionales le dan la confianza de que sus datos son correctos con los principios de ACID.
fuente
También podría valer la pena mencionar que su modelo de datos tiene una gran influencia en las cosas. Si necesita crear alguna forma de estructura de árbol (es decir, tiene una clave foránea autorreferenciada en una tabla que contiene dicha clave foránea en una clave primaria compuesta) probablemente debería considerar hacerlo en alguna forma de base de datos que maneje esos tipos de datos realmente bien (como mongodb o couchdb).
Como han dicho otras personas, también debe tener en cuenta lo que sucede en su aplicación. si realmente necesita ACID en varias tablas, entonces realmente necesita seguir con un RDBMS, pero si tiene algo donde puede tener algunos datos ligeramente obsoletos y necesita la flexibilidad de un esquema NoSQL (llámelo sin esquema si lo desea, pero todavía tiene alguna forma de esquema implícito), entonces podría considerar comprar una tienda NoSQL ( http://www.10gen.com/customers/craigslist aquí es un ejemplo de por qué Craigslist cambió ... pero es cierto que están archivando ~ 10TB de datos, que sé que no encajan en el tamaño de su base de datos de tamaño pequeño a mediano en absoluto. Pero el caso de uso podría ser útil).
Tenga en cuenta que los sistemas NoSQL no necesariamente están ahí para reemplazar los RDMS, pero en muchos casos puede complementar su RDBMS a través de la idea de Polyglot Persistence y puede almacenar la mayoría de sus datos en un RDBMS, pero en instancias específicas de nicho puede descargar algunos de sus datos a alguna forma de tienda NoSQL.
fuente
Mongo
se puede instalar en varias computadoras / nodos.PostgreSQL
no proporciona una herramienta integrada para fragmentar, sin embargo, citus está presente.MongoDB admite bases de datos de hasta 64 terabytes y el tamaño del documento es de 16 megabytes.
MySQL tiene un límite de base de datos de 256 terabytes, 64 terabytes del tamaño máximo para una tabla y un límite de registro de 4 gigabytes
PostgreSQL no tiene límite en la base de datos (4 terabytes existen en algún lugar para la prueba) y tiene un límite de 1 gigabytes para el tamaño de cualquier campo en una tabla y nuevamente 64 terabytes el tamaño máximo para una tabla.
fuente