考虑一个 EAV 表,每个数据类型都有单独的列:
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;
现在我想存储username
列 for entity_id=5
,它是一个 VARCHAR:
INSERT INTO eav_values (entity_id, name, type, col_varchar)
VALUES (5, 'username', 'varchar', 'jeffatwood');
如何构造 SELECT 语句以通过单个查询从正确的列中进行选择?
SELECT (MAGIC HERE) FROM eav_values
WHERE entity_id=5 AND name='username' LIMIT 1;
我最好只是合并值并仔细管理应用程序代码中的数据吗?这样的 SELECT 没有真正的性能损失吗?
SELECT COALESCE(col_varchar, col_int, col_datetime) FROM eav_values
WHERE entity_id=5 AND name='username' LIMIT 1;
或者可能将数据复制到冗余read
VARCHAR 列中以供读取?
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;
请注意,我想为每个值使用不同的数据类型,因为在某些情况下我可能需要在某些列上建立索引或执行特定于数据类型的逻辑,在这些情况下我会知道哪种数据类型或者我将使用单独的 SELECT 来获取列类型。
1 个回答