En MySQL, cuando los pares clave-valor (datos no relacionales) se almacenan en InnoDB o NDB, ¿pueden las operaciones SQL consultar esos mismos datos?

Creo que está malinterpretando lo que significa el término “pares clave-valor” en una base de datos relacional (RDBMS), en comparación con una base de datos orientada a documentos (NoSQL-).

Al escribir en una base de datos NoSQL, está escribiendo datos estructurados (por ejemplo, una matriz asociativa de longitud arbitraria) para almacenarlos en una sola clave (que sería su clave principal en un RDMBS tradicional). Las otras columnas se generarían dinámicamente según su recuento y su nombre. Si traduce esta estructura a una tabla RDBMS, imagine que tendría la unión de todas las claves de matriz existentes como sus columnas. Si selecciona una fila (identificada por su clave principal) que no contiene la clave de matriz que está buscando para el conjunto, simplemente devolverá NULL.

Puede implementar dicha técnica en un RDBMS, pero necesitaría usar muchas instrucciones ALTER TABLE para cada instrucción INSERT / UPDATE, lo que por supuesto no es práctico.

Podría, por supuesto, hacer lo mismo usando solo una tabla con tres columnas: pkey, key, value con (pkey, key) como su clave principal. Luego, para una matriz (digamos $helloworld = Array("hello"=>"world", "foo"=>"bar") ), insertaría dos filas:

pkey = ‘helloworld’, clave = ‘hola’, valor = ‘mundo’
pkey = ‘helloworld’, clave = ‘foo’, valor = ‘bar’

Sin embargo, para poder utilizar esta estructura de una manera que un NoSQL-DBMS lo admita, tendrías que hacer muchas autouniones. Para obtener el valor de “hola” donde el valor de “foo” es igual a “barra” (que es una tarea fácil en las bases de datos NoSQL) tendría que escribir algo como

SELECT b.hello FROM keyvalues a INNER JOIN keyvalues b ON a.pkey = b.pkey AND a.key = 'foo' AND b.key = 'hello' WHERE a.key = 'foo' AND a.value = 'bar'

que no es realmente eficiente (al menos no en comparación con una base de datos NoSQL).

SQL, InnoDB o cualquier otro motor de base de datos no lo ayudará en absoluto a utilizar un RDBMS como reemplazo de los datos NoSQL. Depende de usted definir una estructura de tabla y consulta que se adapte a sus necesidades.

No existe tal cosa como “datos NoSQL”. La “propiedad NoSQL” es una propiedad del administrador de datos, no los datos en sí.

Si está pensando en pares de nombre-valor donde el “área de valor” es algún tipo de cadena definida por la aplicación de algún tipo (es decir, un objeto de Java / Python ordenado, etc.), estos definitivamente se pueden almacenar en MySQL. Este tipo de áreas de datos opacos no se pueden consultar fácilmente en MySQL, pero esto es cierto para los db NoSQL y la descripción del formato de los datos está oculta en el código de la aplicación del lado del cliente en ambos casos.

De hecho, estos funcionan particularmente bien en InnoDB si la clave es la clave principal, ya que InnoDB almacenará los datos en un B-Tree primario basado en la PK.

Tenemos mesas con miles de millones de estas en nuestro entorno. Dependiendo del tipo y tamaño del “área de valor”, los almacenamos como varchars, varbinaries o varios tipos de blobs.

Una cosa buena acerca del uso de una base de datos relacional para este tipo de datos es que puede hacer que partes de su “área de datos” sean visibles y buscables a nivel SQL simplemente creando estas partes como columnas adicionales.

Dicho esto, una cosa (entre muchas) que desearía que MySQL admitiera son campos JSON explícitos e índices basados ​​en nombres en el JSON mismo del tipo que admite Postgres ahora. Eso es bastante útil y genial …