Acabo de comenzar a usar una base de datos basada en documentos NoSQL (MongoDB) y tengo curiosidad sobre las mejores prácticas para diseñar bases de datos.
¿Supongo que la arquitectura debería ser diferente de las bases de datos relacionales? ¿Debo seguir apuntando a una base de datos normalizada?
Por ejemplo, tengo un caso de uso particular;
Tengo un usuario con un historial de alquiler (conjunto de direcciones) ¿ese conjunto debería ser un conjunto para el usuario o como una colección separada con una clave compartida?
Respuestas:
El enfoque apropiado para el diseño de la base de datos NoSQL es un DDD ( diseño controlado por dominio ). Para algunas personas que solían diseñar RDBMS, NoSql se parece a los antipatrones Sql y tiene más sentido cuando se considera en el ámbito de un DDD.
Dependiendo del uso de las direcciones, puede definirlo como un objeto de valor dentro de su modelo / entidad de historial de alquiler.
Aquí hay algunas referencias que pueden aclarar las ideas sobre el diseño con NoSQL:
fuente
TL; DR
La normalización en RDBMS le permite aprovechar las fortalezas del paradigma relacional.
La desnormalización en NoSQL le permite aprovechar las fortalezas del paradigma NoSQL.
Respuesta larga
Los RDBMS son excelentes porque le permiten modelar entidades estructuradas únicas (mutables o no) y sus relaciones entre sí. Esto significa que es muy fácil trabajar a nivel de entidad, actualizar sus propiedades, insertar otra, eliminar una, etc. Pero también es excelente para agregarlos dinámicamente, un perro con su dueño, un perro con las casas en las que reside, etc. El RDBMS le brinda herramientas para facilitar todo esto. Se unirá por usted, manejará los cambios atómicos en las entidades por usted, etc.
Las bases de datos NoSQL son excelentes porque le permiten modelar agregados semi / no estructurados y entidades dinámicas. Esto significa que es muy fácil modelar entidades siempre cambiantes, entidades que no todas comparten los mismos atributos y agregados jerárquicos.
Para modelar para NoSql, debe pensar en términos de jerarquía y agregados en lugar de entidades y relaciones. Por lo tanto, no tiene una persona, direcciones de alquiler y una relación entre ellos. Tiene registros de alquiler que agregan para cada persona las direcciones de alquiler que han tenido.
Debe preguntar qué datos necesitaré cambiar juntos. Qué datos está agrupando lógicamente los otros datos. En su caso, una persona suena como un buen agregado. ¿Cuál es el punto de entrada lógico hacia el resto de los datos?
NoSQL, digamos, almacena una cosa que tiene otras cosas que tienen cosas propias. Devuélveme toda la jerarquía de las cosas. Permítanme cambiarlo como me plazca, ahora reemplace toda la jerarquía de cosas con mi cambio. Eso es casi todo lo que te da. ¿Por qué es útil? Si lo que tienes es una jerarquía de cosas con las que siempre interactúas como un todo. O si necesita escalar masivamente.
Todo lo demás que RDBMS le brinda, deberá implementarlo manualmente en el código y en su esquema. Tendrá que unirse al código si alguna vez necesita un agregado de agregados. Tendrá que analizar si solo necesita parte de un agregado. Tendrá que comprobar la unicidad usted mismo si no desea duplicar cosas. Tendrá que implementar su propia lógica transaccional cuando trabaje en agregados, etc.
Así que tener una gran mesa con todo lo que necesitas es el camino a seguir en NoSql. Dado que la atomicidad está garantizada solo en ese nivel, y el rendimiento también. Determinar sus relaciones temprano es importante. Esto es lo que es la desnormalización.
En RDBMS, la desnormalización paraliza efectivamente su DB a una NoSQL. Entonces normalmente quieres lo contrario, es decir, la normalización. Si no lo hace, debería usar un DB NoSQL en su lugar. A menos que necesite un poco de ambos.
fuente