Cuando el esquema de una tabla tiene cientos o miles de columnas que no se definen con antelación, como suele ocurrir en escenarios de Internet de los Vehículos (IoV), definir cada columna desde el inicio no es viable. Agregar una nueva columna cada vez con ALTER TABLE resulta lento y costoso a nivel operativo.
Lindorm admite columnas dinámicas para escribir y consultar datos sin un esquema fijo, pero estas solo aceptan datos VARBINARY. Las columnas comodín amplían esta funcionalidad al permitir declarar un patrón de nombres y un tipo de datos destino: cualquier columna escrita en la tabla cuyo nombre coincida con el patrón se acepta automáticamente y se convierte a dicho tipo.
Funcionamiento
Una columna comodín se declara en la cláusula WITH mediante la propiedad wildcard_column. El nombre de la columna contiene uno o más caracteres comodín:
|
Comodín |
Coincidencias |
|
|
Una secuencia de caracteres de cualquier longitud, incluida la vacía |
|
|
Exactamente un carácter |
Por ejemplo, declarar c* INT significa que cualquier columna cuyo nombre comience con c (como c10, c11 o c20) se acepta y su valor se convierte a INT.
Al escribir, Lindorm compara el nombre de la columna entrante con los patrones declarados. Al consultar, utilice los nombres reales de las columnas (no los patrones de comodín) en las cláusulas SELECT y WHERE.
Requisitos previos
LindormTable 2.5.3 o posterior. Para comprobar o actualizar su versión, consulte Release notes of LindormTable y Upgrade the minor engine version of a Lindorm instance.
DDL
Crear una tabla con columnas comodín
La siguiente instrucción crea la tabla tb con dos columnas comodín: c2* (BIGINT) y c3* (VARCHAR). Ambas se declaran en la cláusula WITH mediante wildcard_column.
CREATE TABLE tb (
pk INTEGER,
c1 VARCHAR,
`c2*` BIGINT,
`c3*` VARCHAR,
PRIMARY KEY (pk)
) WITH (wildcard_column='c2*,c3*');
Una vez creada esta tabla:
Se acepta cualquier columna cuyo nombre comience con
c2(por ejemplo,c2,c21,c22). Si su valor no es BIGINT, se convierte a BIGINT.Se acepta cualquier columna cuyo nombre comience con
c3(por ejemplo,c32,c33,c35). Si su valor no es VARCHAR, se convierte a VARCHAR.
Crear un índice de búsqueda en columnas comodín
Es posible crear índices de búsqueda en columnas comodín. El índice abarca todas las columnas cuyos nombres coinciden con los patrones de comodín al momento de la escritura.
CREATE INDEX idx USING SEARCH ON tb (`c2*`, `c3*`);
No se pueden crear índices secundarios en columnas comodín. La siguiente instrucción no es compatible:
CREATE INDEX idx ON tb (c2*);
DML
Escritura de datos
Con la tabla tb creada anteriormente, la siguiente instrucción UPSERT escribe una fila con columnas que coinciden con ambos patrones de comodín (c2, c21, c22 coinciden con c2*; c31 coincide con c3*):
UPSERT INTO tb (pk, c1, c2, c21, c22, c31)
VALUES (1, 'a1', 2, 21, 22, 'c3');
Cada columna en la instrucción debe cumplir dos condiciones:
Su nombre coincide con uno de los patrones de comodín declarados.
Su valor es compatible con el tipo de datos de la columna comodín correspondiente (o se puede convertir a este).
Consulta de datos
Utilice los nombres reales de las columnas, no los patrones de comodín, en las cláusulas SELECT y WHERE. La siguiente consulta lee datos de la tabla tb creada y poblada anteriormente:
SELECT pk, c1, c2, c21, c31
FROM tb
WHERE c21 > 10 AND c31 < 'c300';
Para consultar todas las columnas en una tabla que contiene columnas comodín, incluya una cláusula LIMIT:
SELECT * FROM tb LIMIT 10;
Limitaciones
|
Limitación |
Detalle |
|
Claves primarias |
Las columnas comodín no se pueden usar como claves primarias. |
|
|
Debe incluir una cláusula |
|
Tipos de índice |
Solo se admiten índices de búsqueda. Los índices secundarios no son compatibles. |
|
Condiciones de consulta |
Solo se pueden usar nombres reales de columnas en las listas |
Las siguientes instrucciones usan patrones de comodín como condiciones de consulta y no son compatibles:
-- Not supported: wildcard pattern in SELECT list
SELECT c1*, c2 FROM tb WHERE c2 > 10;
-- Not supported: wildcard pattern in WHERE clause
SELECT c1*, c2 FROM tb WHERE c1* > 10;
En su lugar, utilice los nombres reales de las columnas:
-- Supported
SELECT pk, c1, c2, c21, c31 FROM tb WHERE c21 > 10 AND c31 < 'c300';