Esquema de base de datos para uno a muchos o muchos a muchos usando matrices JSON

Resuelto Thunderbolt asked hace 10 meses • 0 respuestas

¿Debería ser mejor el esquema para la relación de 1 a muchos o de muchos a muchos usando matrices JSON o tablas de relaciones tradicionales para obtener un mejor rendimiento usando mysql (planetscale)?

  • Usando matrices solo se usa 1 tabla:

ingrese la descripción de la imagen aquí

  • De muchos a muchos usando 3 tablas

ingrese la descripción de la imagen aquí

De manera similar, en el caso de 1 a muchos, ¿las matrices serían mucho mejores?

He visto que las matrices json deben almacenarse como binarias, pero eso es mejor que tener otra tabla e indexar todos los valores.

Siguiente pregunta:

También necesitaré almacenar me gusta, comentarios y colaboradores. ¿Se pueden almacenar también utilizando un enfoque similar de matrices/tablas de relaciones?

Thunderbolt avatar Feb 16 '24 19:02 Thunderbolt
Aceptado

Probablemente no sea mejor usar JSON para las referencias que describe, pero depende de las consultas que necesite ejecutar.

JSON es peor para la flexibilidad de las consultas.

Como cualquier forma de desnormalización, JSON mejora una cosa (la flexibilidad de la estructura), a expensas de todos los demás aspectos del almacenamiento y la consulta de datos.

Si debe optimizar una consulta específica (obtener toda la matriz de la tabla principal) y no le importa la eficiencia de nada más, entonces quizás la desnormalización esté justificada. Pero esa es una situación bastante rara.

JSON es peor por la complejidad del código.

Muchas personas tienen dificultades para escribir consultas cuando sus datos se almacenan en formato JSON. Simplemente revise algunas de las preguntas anteriores en elmysql-jsonetiqueta. Consultar y actualizar datos en JSON requiere mucha más experiencia y genera consultas largas que requieren más tiempo para desarrollarse, son más difíciles de leer y depurar y terminan costándole más a su empleador, porque una tarea que lleva minutos desarrollar para tablas SQL normalizadas podría toma días cuando usas JSON.

Si no me cree, le sugiero que cree un prototipo de las consultas que necesitará ejecutar en su aplicación. ¿Cuánto tiempo le lleva desarrollar una consulta para, por ejemplo, unir su matriz de muchos a muchos a la tabla relacionada? ¿Qué tal desarrollar una ACTUALIZACIÓN para agregar un elemento a la matriz, asegurándose de no agregar un valor duplicado que ya esté en la matriz?

JSON es peor para el rendimiento.

MySQL 8.0 admite claves de valores múltiples , por lo que puede crear un índice en una matriz JSON, pero existen limitaciones y no siempre puede crear un índice en JSON arbitrario. Sin un índice, es posible que para buscar en la matriz JSON sea necesario recurrir a un escaneo de tabla, lo que da como resultado un rendimiento deficiente.

JSON es peor para la integridad referencial.

Actualmente, la implementación no admite la definición de una restricción de clave externa en los valores de la clave de valores múltiples.

Sin una restricción de clave externa, no tiene seguridad de que todos los valores de su matriz sean realmente referencias a datos que existen en la tabla a la que se hace referencia. ¿Qué pasa si eliminas una fila en esa otra tabla? ¿Recordaste actualizar la matriz JSON para eliminar el valor que eliminaste? ¿Cómo sabes que esto es cierto para todos los valores de la matriz? ¿Cómo los comprobarías?

JSON es peor para el almacenamiento.

Almacenar los mismos datos en JSON consume entre 2 y 3 veces más espacio de almacenamiento. Si paga por el almacenamiento (por ejemplo, en la nube), esto aumentará sus costos.

La línea de fondo

Básicamente, JSON es bueno sólo cuando realmente necesitas almacenar datos semiestructurados. El caso de uso que describió, una matriz simple que imita una relación de uno a muchos o de muchos a muchos, tiene una estructura muy predecible, por lo que sería mejor en casi todos los sentidos almacenarla como filas y columnas normales.

Para una relación de muchos a muchos, la solución estándar es crear una tercera tabla. ¿Por qué intentas evitar esto? Es más eficiente en todos los sentidos que usar JSON.

Bill Karwin avatar Feb 16 '2024 14:02 Bill Karwin