mongoDB - Discusión sobre MongoDB respecto a la integridad referencial vs redundancia.

 
Vista:
Imágen de perfil de Camilo

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:

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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 38
Ha disminuido 1 puesto en mongoDB (en relación al último mes)
Gráfica de mongoDB

Discusión sobre MongoDB respecto a la integridad referencial vs redundancia.

Publicado por xve (44 intervenciones) el 29/01/2016 10:06:32
Hola Camilo, este tipo de duda la hemos tenido todos los que hemos empezado a trabajar con bases de datos no relacionales...

Partiendo de que no soy un experto, te comento que yo personalmente guardo todos los datos en cada una de las colecciones, y te voy a explicar porque...
Actualmente estamos en un proyecto que movemos mas de mil millones de registros, esto quiere decir, que la base de datos esta en varios nodos y cada uno de ellos esta replicado. Si intentáramos utilizar el método tradicional, de referenciar valores en otras tablas, las consultas no serian óptimas, ya que tendría que hacer varias consultas, y en diferentes nodos. Si esta todo agrupado, y encima los campos de la búsqueda están en índices, las respuestas son extremadamente rápidas.

Muchas veces, utilizar base de datos no relacional, incremente el tamaño en disco comparado con base de datos relacional, pero recuerda que con una base de datos relacional, no puedes dispones de esa base de datos en diferentes nodos...

No se si me he sabido explicar... coméntame, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Camilo

Discusión sobre MongoDB respecto a la integridad referencial vs redundancia.

Publicado por Camilo (2 intervenciones) el 29/01/2016 12:17:29
Hola, muchas gracias por tomarte el tiempo de responder. Si te entendí, fue bastante claro tu mensaje. No había tenido en cuenta el tema de replicación.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar