Considere uma tabela EAV com colunas separadas para cada tipo de dados:
CREATE TABLE eav_values (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
entity_id INT NOT NULL,
name VARCHAR(127) NOT NULL,
type SET('varchar','int','datetime') NOT NULL,
col_varchar VARCHAR(1023) NULL DEFAULT NULL,
col_int INT NULL DEFAULT NULL,
col_datetime DATETIME NULL DEFAULT NULL
) ENGINE=InnoDB;
Agora eu gostaria de armazenar a username
coluna para entity_id=5
, que é um VARCHAR:
INSERT INTO eav_values (entity_id, name, type, col_varchar)
VALUES (5, 'username', 'varchar', 'jeffatwood');
Como alguém construiria a instrução SELECT para selecionar na coluna apropriada com uma única consulta?
SELECT (MAGIC HERE) FROM eav_values
WHERE entity_id=5 AND name='username' LIMIT 1;
Seria melhor simplesmente COALESCE os valores e gerenciar cuidadosamente os dados no código do aplicativo? Não há nenhuma penalidade de desempenho real para tal SELECT?
SELECT COALESCE(col_varchar, col_int, col_datetime) FROM eav_values
WHERE entity_id=5 AND name='username' LIMIT 1;
read
Ou talvez duplique os dados em uma coluna VARCHAR redundante para leitura?
INSERT INTO eav_values (entity_id, name, type, col_varchar, read)
VALUES (5, 'username', 'varchar', 'jeffatwood', 'jeffatwood');
SELECT read FROM eav_values
WHERE entity_id=5 AND name='username' LIMIT 1;
Observe que eu gostaria de usar tipos de dados diferentes para cada valor, pois em alguns casos posso precisar indexar ou executar lógica específica de tipo de dado em determinadas colunas, nesses casos saberei qual tipo de dados ou usarei um SELECT separado para obter o tipo de coluna.
1 respostas