Quando o schema de uma tabela possui centenas ou milhares de colunas não definidas previamente — cenário comum em Internet dos Veículos (IoV) —, definir cada coluna antecipadamente torna-se inviável. Adicionar uma nova coluna sempre que necessário com ALTER TABLE gera lentidão e alto custo operacional.
O Lindorm oferece suporte a colunas dinâmicas para escrita e consulta de dados sem um schema fixo, mas essas colunas aceitam apenas dados do tipo VARBINARY. As colunas curinga estendem essa funcionalidade ao permitir declarar um padrão de nomenclatura e um tipo de dados alvo: qualquer coluna gravada na tabela cujo nome corresponda ao padrão é automaticamente aceita e convertida para esse tipo.
Funcionamento
Declare uma coluna curinga na cláusula WITH por meio da propriedade wildcard_column. O nome da coluna contém um ou mais caracteres curinga:
|
Curinga |
Correspondência |
|
|
Sequência de caracteres de qualquer comprimento, inclusive vazia |
|
|
Exatamente um caractere |
Por exemplo, declarar c* INT significa que qualquer coluna cujo nome comece com c — como c10, c11 ou c20 — será aceita e terá seu valor convertido para INT.
Durante a escrita, o Lindorm compara o nome da coluna recebida com os padrões declarados. Na consulta, utilize os nomes reais das colunas (e não os padrões curinga) nas cláusulas SELECT e WHERE.
Pré-requisitos
LindormTable 2.5.3 ou posterior. Para verificar ou atualizar sua versão, consulte Release notes of LindormTable e Upgrade the minor engine version of a Lindorm instance.
DDL
Crie uma tabela com colunas curinga
A instrução a seguir cria a tabela tb com duas colunas curinga: c2* (BIGINT) e c3* (VARCHAR). Ambas são declaradas na cláusula WITH via wildcard_column.
CREATE TABLE tb (
pk INTEGER,
c1 VARCHAR,
`c2*` BIGINT,
`c3*` VARCHAR,
PRIMARY KEY (pk)
) WITH (wildcard_column='c2*,c3*');
Após a criação desta tabela:
Qualquer coluna cujo nome inicie com
c2(por exemplo,c2,c21,c22) será aceita. Caso o valor não seja BIGINT, o sistema o converterá para BIGINT.Colunas com nomes iniciados em
c3(comoc32,c33,c35) também são aceitas. Valores diferentes de VARCHAR serão convertidos para VARCHAR.
Crie um índice de busca em colunas curinga
Crie índices de busca em colunas curinga. O índice abrange todas as colunas cujos nomes correspondem aos padrões curinga no momento da escrita.
CREATE INDEX idx USING SEARCH ON tb (`c2*`, `c3*`);
Não é possível criar índices secundários em colunas curinga. A seguinte instrução não tem suporte:
CREATE INDEX idx ON tb (c2*);
DML
Gravar dados
Com a tabela tb criada anteriormente, a instrução UPSERT abaixo grava uma linha com colunas que correspondem a ambos os padrões curinga (c2, c21, c22 correspondem a c2*; c31 corresponde a c3*):
UPSERT INTO tb (pk, c1, c2, c21, c22, c31)
VALUES (1, 'a1', 2, 21, 22, 'c3');
Cada coluna na instrução deve atender a duas condições:
O nome deve corresponder a um dos padrões curinga declarados.
O valor precisa ser compatível com o tipo de dados da coluna curinga correspondente (ou passível de conversão para ele).
Consultar dados
Nas cláusulas SELECT e WHERE, use os nomes reais das colunas em vez dos padrões curinga. A consulta a seguir lê dados da tabela tb criada e populada acima:
SELECT pk, c1, c2, c21, c31
FROM tb
WHERE c21 > 10 AND c31 < 'c300';
Para consultar todas as colunas em uma tabela que contém colunas curinga, inclua uma cláusula LIMIT:
SELECT * FROM tb LIMIT 10;
Limitações
|
Limitação |
Detalhe |
|
Chaves primárias |
Colunas curinga não podem ser usadas como chaves primárias. |
|
|
Inclua obrigatoriamente uma cláusula |
|
Tipos de índice |
Apenas índices de busca têm suporte. Índices secundários não são suportados. |
|
Condições de consulta |
Somente nomes reais de colunas podem ser usados em listas |
As instruções a seguir utilizam padrões curinga como condições de consulta e não têm suporte:
-- 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;
Em vez disso, utilize os nomes reais das colunas:
-- Supported
SELECT pk, c1, c2, c21, c31 FROM tb WHERE c21 > 10 AND c31 < 'c300';