EAV(Entity–Attribute–Value,实体–属性–值)模型常用于属性高度动态、稀疏、Schema 不固定的场景(如电商商品、医疗档案、配置系统)。但它天然存在查询复杂、JOIN 多、聚合慢的问题。下面从「模型设计 → 存储 → 查询 → 架构」系统讲如何提升 EAV 性能。
✅ 示例
商品表:
products(
id,
title, -- 普通列
price, -- 普通列
category_id -- 普通列
)
product_attrs( -- 真正的 EAV
product_id,
attr_id,
value
)
attr_id 用字典表,而不是字符串WHERE attr = 'color'(字符串比较慢)attributes(id, name, type)
按 属性类型 拆分:
product_attrs_int
product_attrs_decimal
product_attrs_text
避免一行存多种类型导致索引失效。
product_attr_snapshot (
product_id,
color,
size,
weight
)
在 PostgreSQL / MySQL 8+:
attributes JSONB
WHERE attributes @> '{"color":"red"}'
✅ 很多场景 JSON 比传统 EAV 快 10x+
❌ 错误:
for product in products:
select * from eav where product_id = ?
✅ 正确:
SELECT * FROM eav WHERE product_id IN (...)
SELECT
product_id,
MAX(CASE WHEN attr='color' THEN value END) AS color,
MAX(CASE WHEN attr='size' THEN value END) AS size
FROM eav
GROUP BY product_id
(product_id, attr_id)
(attr_id, value)
流程:
写 → DB(EAV)
→ 同步 → ES
读 → ES
❌ 属性稳定
❌ 需要复杂事务
❌ 高频聚合
✅ 替代方案:
EAV 不是性能问题,而是“用错地方”的问题
高频属性列化,低频属性 EAV 或 JSON,查询走宽表 / 搜索引擎。
如果你有具体场景(MySQL / PG / 商品 / 医疗 / 配置),我可以给你直接可落地的表结构 + SQL。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。