EAV(Entity-Attribute-Value,实体-属性-值)模型是一种灵活的数据建模方式,常用于属性高度动态、稀疏、难以固定的场景(如电商商品参数、医疗病历、CRM自定义字段等)。但它也以“查询复杂、性能差、类型不安全”著称。
下面从模型设计、存储、查询、索引、架构几个层面系统讲一下 EAV 的优化思路。
不要什么都用 EAV
✅ 混合模型(宽表 + EAV)是最常见做法
attribute
id
name
data_type (int/string/decimal/date)
is_required
entity_type
eav_product
eav_user
eav_order
而不是一个巨型 eav_values
✅ 减少数据量
✅ 提高缓存命中率
eav_int
eav_decimal
eav_string
eav_datetime
避免所有值都存成 VARCHAR
✅ 类型安全
✅ 查询更快
现代数据库(MySQL 8 / PostgreSQL)支持:
jsonbJSON示例:
attributes JSONB
适合:
⚠️ 注意 JSON 查询索引问题
EAV(写) + 宽表(读)
eav → ETL → flat_table
✅ 查询极快
❌ 有延迟(可用 CDC 降低)
❌ 错误:
for attr in attributes:
select * from eav where ...
✅ 正确:
SELECT *
FROM eav
WHERE entity_id IN (...)
SELECT
entity_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 entity_id
适合报表类查询
例如电商:
→ 直接存主表
(entity_id, attribute_id)
(attribute_id, value)
用于:
不是所有属性都要索引
✅ 热属性索引
❌ 冷属性不索引
典型架构:
MySQL(EAV) → ES(搜索)
entity_id → full attribute map
Redis / 本地缓存
❌ 属性稳定
❌ 高频聚合查询
❌ 强事务要求
EAV 优化的核心:少用、分表、落宽表、缓存、读写分离
如果你有具体场景(比如电商 / 医疗 / 配置系统 / 用哪种数据库),我可以直接给你表结构 + 查询示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。