Discusión sobre MongoDB respecto a la integridad referencial vs redundancia.
Publicado por Camilo (2 intervenciones) el 28/01/2016 22:02:06
Saludos a todos,
Mi intención con este hilo es generar una discusión sobre un tema que me ha estado rondando en la cabeza y la verdad no me ha dejado dormir. Agradezco compartir sus impresiones al respecto, su posición y sus prácticas al respecto.
La inquietud que roba mis sueños es básicamente esta:
Al dar el paso hacia las bases de datos NoSQL es inevitable tener que cambiar un poco la forma de pensar a la hora de diseñar una base de datos ya que el modelo relacional convencional es increíblemente diferente al modelo NoSQL. En un par de proyectos en los que he estado trabajando he tenido que cuestionarme muchas veces sobre cómo almacenar los datos en la base de datos para tratar de garantizar de cierta manera la “Integridad referencial” de la base de datos.
Me gustaría conocer cuál debería ser esa “Buena práctica” para poder tener:
1) Consistencia en los datos.
2) Buen uso del motor de base de datos (NoSQL).
3) Buen rendimiento.
Tomando como base un modelo relacional, para un caso hipotético de una tabla cuyo dominio sean las ciudades de un país, en dicha tabla tendría una llave foránea hacia la tabla ciudades y almacenaría solamente el Id de la ciudad.
Ahora bien, en un modelo orientado a documentos (Como MongoDb), la semántica del modelo NoSQL indicaría que no tiene sentido almacenar los datos de la misma manera como lo haría en el modelo relacional, es decir, si tengo un documento en MongoDB con el siguiente modelo:
Sintácticamente es correcto e incluso semánticamente; sin embargo, al tener un millón de registros (por ejemplo) con este mismo modelo estaría sufriendo de un terrible problema de redundancia de datos ya que los datos referentes a ciudades y países se estarían repitiendo por cada documento… mucho más aún en estructuras de documentos más complejas.
Si aplicara un poco de la lógica relacional me quedaría con un modelo como este:
Así acabaría de cierta manera con el problema de redundancia y con ayuda de la lógica de la aplicación podría ayudar un poco a que exista algo de integridad referencial, sin embargo, algo me dice que al hacerlo de esta manera no estaría aplicando de manera adecuada la “filosofía” NoSQL en dónde hablar de integridad referencial no tiene mucho sentido.
Sé que para algunos este tema puede ser trivial, pero creo fielmente que las cosas se deben hacer bien y realmente quiero aplicar buenas prácticas a la hora de diseñar mis bases de datos NoSQL.
Me gustaría escuchar sus opiniones al respecto: ¿cuál debería ser la manera adecuada de almacenar los datos cuando dichos datos están asociados a otros documentos?, ¿Qué buenas prácticas me recomiendan?, ¿Saben de literatura asociada a este tema?
De antemano, gracias por sus apreciaciones.
Mi intención con este hilo es generar una discusión sobre un tema que me ha estado rondando en la cabeza y la verdad no me ha dejado dormir. Agradezco compartir sus impresiones al respecto, su posición y sus prácticas al respecto.
La inquietud que roba mis sueños es básicamente esta:
Al dar el paso hacia las bases de datos NoSQL es inevitable tener que cambiar un poco la forma de pensar a la hora de diseñar una base de datos ya que el modelo relacional convencional es increíblemente diferente al modelo NoSQL. En un par de proyectos en los que he estado trabajando he tenido que cuestionarme muchas veces sobre cómo almacenar los datos en la base de datos para tratar de garantizar de cierta manera la “Integridad referencial” de la base de datos.
Me gustaría conocer cuál debería ser esa “Buena práctica” para poder tener:
1) Consistencia en los datos.
2) Buen uso del motor de base de datos (NoSQL).
3) Buen rendimiento.
Tomando como base un modelo relacional, para un caso hipotético de una tabla cuyo dominio sean las ciudades de un país, en dicha tabla tendría una llave foránea hacia la tabla ciudades y almacenaría solamente el Id de la ciudad.
Ahora bien, en un modelo orientado a documentos (Como MongoDb), la semántica del modelo NoSQL indicaría que no tiene sentido almacenar los datos de la misma manera como lo haría en el modelo relacional, es decir, si tengo un documento en MongoDB con el siguiente modelo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"_id": ObjectId("56986ee226b37e01d5a7726c"),
"Name": "Camilo",
"LastName": "Bernal",
"Tags": ["Developer", "Geek"],
"City":{
"Code": 1,
"Country": {
"Code": 57,
"Name": "Colombia"
},
"Name": "Bogotá",
"Description": "Bogota City"
}
}
Sintácticamente es correcto e incluso semánticamente; sin embargo, al tener un millón de registros (por ejemplo) con este mismo modelo estaría sufriendo de un terrible problema de redundancia de datos ya que los datos referentes a ciudades y países se estarían repitiendo por cada documento… mucho más aún en estructuras de documentos más complejas.
Si aplicara un poco de la lógica relacional me quedaría con un modelo como este:
1
2
3
4
5
6
7
{
"_id": ObjectId("56986ee226b37e01d5a7726c"),
"Name": "Camilo",
"LastName": "Bernal",
"Tags": ["Developer", "Geek"],
"City":"571"
}
Así acabaría de cierta manera con el problema de redundancia y con ayuda de la lógica de la aplicación podría ayudar un poco a que exista algo de integridad referencial, sin embargo, algo me dice que al hacerlo de esta manera no estaría aplicando de manera adecuada la “filosofía” NoSQL en dónde hablar de integridad referencial no tiene mucho sentido.
Sé que para algunos este tema puede ser trivial, pero creo fielmente que las cosas se deben hacer bien y realmente quiero aplicar buenas prácticas a la hora de diseñar mis bases de datos NoSQL.
Me gustaría escuchar sus opiniones al respecto: ¿cuál debería ser la manera adecuada de almacenar los datos cuando dichos datos están asociados a otros documentos?, ¿Qué buenas prácticas me recomiendan?, ¿Saben de literatura asociada a este tema?
De antemano, gracias por sus apreciaciones.
Valora esta pregunta
0