¿Por qué ‘No se pueden hacer combinaciones’ se considera un argumento fuerte contra las bases de datos NoSQL?

Las UNIONES son importantes porque le permiten mantener una única fuente de verdad y acceder fácilmente a datos dispares.

En teoría, JOIN me permite conectar cualquier dato en la base de datos a cualquier otro dato relacionado simplemente conectando las tablas. Esto significa que puedo crear una estructura completamente normalizada y almacenar cada pieza de datos exactamente una vez en exactamente un lugar. es decir, una base de datos completamente normalizada

Un buen efecto secundario de esto es que no tengo que preocuparme por cosas como sincronizar los datos. Solo hay una entrada y una fuente de verdad. Los números devueltos por una consulta dada son “tan correctos” como pueden ser.

El otro efecto secundario es que puedo consultar datos de partes dispares del sistema y reunirlos de una manera que quizás no haya planeado de antemano.

El problema clave aquí es que las uniones no se escalan muy bien en varias computadoras. Se puede hacer, pero es difícil y no es fácil generalizar. La mayoría de las bases de datos “orientadas a documentos” específicamente desean escalar en múltiples computadoras. Por lo tanto, simplemente sueltan las UNIONES y algunas otras funciones de consulta y, de repente, escalar a través de múltiples nodos se vuelve dramáticamente más fácil.

Pero luego también pierdes esos agradables efectos secundarios que enumeré anteriormente.

Por ejemplo, si envía correos electrónicos a los usuarios pero los almacena en diferentes “colecciones”, ¿cómo puede averiguar qué usuarios hacen clic en qué correos electrónicos? No puede unir a los usuarios a los correos electrónicos. Los correos electrónicos probablemente tengan ID de usuario, pero eso no tiene sentido para cualquiera que use el sistema. Puede poner el Nombre para mostrar del usuario en el correo electrónico junto con el ID de usuario, pero ¿y si cambia? Ahora debe asegurarse de que los cambios en el Nombre para mostrar del usuario sucedan en ambos lugares.

O bien, termina escribiendo uniones “ad-hoc” donde extrae todos los correos electrónicos relevantes y extrae a todos los usuarios relevantes y los une manualmente en su código.

Hay una compensación aquí. SQL es dramáticamente más poderoso que la mayoría de los lenguajes de consulta para bases de datos orientadas a documentos. Pero SQL tiene problemas / se vuelve costoso más allá de un solo nodo.

Nota extra

Algunas bases de datos “NoSQL” tienen uniones. De hecho, las bases de datos Graph son explícitamente buenas para hacer combinaciones. También hay un mundo de “bases de datos de objetos” que normalmente también admiten alguna forma de unión.

Las uniones permiten un grado masivo de flexibilidad en el modelo de datos. En una base de datos que permite uniones calculadas (es decir, bases de datos relacionales), no tiene que conocer las búsquedas exactas que se realizarán de antemano cuando diseñe el modelo de datos. En las bases de datos que no permiten combinaciones, debe diseñar cuidadosamente el modelo de datos para admitir tipos particulares de búsquedas, y si elige mal, no tiene suerte. En el mejor de los casos, debe construir nuevas estructuras de búsqueda utilizando operaciones por lotes estilo Hadoop.

Esto puede no importar si tiene una aplicación “solo de búsqueda” en la que todo lo que tiene es un identificador y un montón de cosas, pero si permite búsquedas en propiedades generales, esto se convierte en una preocupación importante.

Dicho esto, a medida que los conjuntos de datos alcanzan tamaños de “escala web” (es decir, tamaños de datos de TB múltiple, tablas de miles de millones de filas), incluso las bases de datos relacionales deben diseñarse en torno a patrones de búsqueda específicos, y el fragmentación se convierte en una preocupación, por lo que En esos tipos de bases de datos, la principal ventaja que ofrecen las combinaciones es la flexibilidad en los tipos de búsquedas, pero las consultas aún tienen que encajar en el “patrón” de búsqueda para el que se diseñó originalmente el modelo de datos.

Si desea tener algún tipo de normalización en una base de datos NoSQL, su aplicación debe administrar realizar múltiples consultas y reunir los datos resultantes. A veces es preferible usar SQL y dejar que la capa de la base de datos maneje esto a través de una unión.

Si tiene una base de datos completamente desnormalizada, entonces diría que no tiene un argumento sólido contra las bases de datos NoSQL. De lo contrario, cuanto más normalizado requiera que sean sus datos, más fuerte será su argumento en contra de NoSQL.

En última instancia, la estructura de sus datos es lo que debe determinar qué sistema de base de datos elige. Para los datos transaccionales o los datos donde necesita un alto grado de integridad, sería mejor optar por una base de datos relacional. Si el rendimiento es importante para usted y no le importa un poco de desnormalización, elija una base de datos NoSQL.

Para los DBA de SQL tradicionales, no puede hacer uniones, lo que significa que NoSQL carece de una funcionalidad importante.

Estos últimos años nos han alejado más de las uniones y hay varios patrones a seguir para evitar que traslademos las uniones de la base de datos a nuestro código.

Primero, es importante que establezcamos nuestras “fuentes” de verdad. El Modelo es la primera fuente de verdad. Esto ofenderá la sensibilidad de muchas personas y el principio DRY.

Luego debemos desnormalizar, desnormalizar y distribuir dentro de nuestro modelo. Piense en todos los casos de uso posibles en los que usaría una unión y distribuiría los datos apropiados.

Luego, utilice contextos limitados y practique el diseño impulsado por dominios. bliki: BoundedContext

Escriba sus actores y eventos para actualizar sus datos. http://flow-design.org/overview/

En general, “No se pueden hacer combinaciones” ya no se considera un argumento válido contra la base de datos NoSQL, se considera un signo de ignorancia. Generalmente feliz, así que sé gentil.

Es la definición de NoSQL, una categoría múltiple de tipos diferentes, definida solo por la falta de características relacionales, que básicamente significa uniones.

Las otras respuestas explican casos en los que las uniones son útiles. También pueden llevar mucho tiempo.

Por el contrario, incluso si no necesita uniones, eso no requiere un software incapaz de unir. Simplemente puede usar MySQL como un almacén de tablas basado en su confiabilidad y velocidad, y nunca hacer uniones.

En una situación en la que no necesita hacer decenas de miles de solicitudes por segundo, las uniones pueden ser útiles. Nada es más expresivo que un operador SQL de tres líneas con toneladas de combinaciones. En serio, escribir lo mismo que funciona y se depura en un lenguaje de programación como C ++ llevaría décadas. Todo tiene su lugar y su tiempo.

Es costoso (tiempo del desarrollador) y propenso a errores si tiene que codificar toda la lógica de unión usted mismo que un sistema SQL haría por usted.