EAV(Entity-Attribute-Value,实体-属性-值)模型是一种用来存储高度动态、稀疏属性的数据建模方式,常用于电商商品属性、医疗病历、配置项等场景。
下面从核心结构 → 常见查询方式 → 性能优化 → 示例系统讲一下「EAV 模型如何做查询」。
通常有三张核心表:
1. 实体表(Entity)
entities
| id | type |
|----|----------|
| 1 | product |
2. 属性表(Attribute)
attributes
| id | name | type |
|----|----------|----------|
| 1 | color | string |
| 2 | weight | number |
3. 值表(Value)
entity_values
| entity_id | attribute_id | value |
|-----------|--------------|-----------|
| 1 | 1 | red |
| 1 | 2 | 10 |
SELECT a.name, v.value
FROM entity_values v
JOIN attributes a ON v.attribute_id = a.id
WHERE v.entity_id = 1;
结果:
color: red
weight: 10
查“红色且重量 > 5 的商品”
SELECT e.id
FROM entities e
JOIN entity_values v1
ON e.id = v1.entity_id AND v1.attribute_id = 1
JOIN entity_values v2
ON e.id = v2.entity_id AND v2.attribute_id = 2
WHERE v1.value = 'red'
AND CAST(v2.value AS NUMERIC) > 5;
⚠️ 每多一个条件,就多一次 JOIN。
MySQL 示例
SELECT
e.id,
MAX(CASE WHEN a.name = 'color' THEN v.value END) AS color,
MAX(CASE WHEN a.name = 'weight' THEN v.value END) AS weight
FROM entities e
JOIN entity_values v ON e.id = v.entity_id
JOIN attributes a ON v.attribute_id = a.id
GROUP BY e.id;
结果:
id | color | weight
1 | red | 10
✅ 适合报表、搜索、过滤
CREATE VIEW product_view AS
SELECT ... -- 上面的 PIVOT SQL
应用层直接查视图。
流程:
写入 EAV → 异步同步到宽表
values_string
values_number
values_datetime
避免 CAST 和类型混乱。
适合:
| 问题 | 对策 |
|---|---|
| JOIN 多、慢 | 宽表 / 视图 |
| 类型不一致 | 属性类型表 |
| 条件组合复杂 | 搜索引擎 |
| 聚合困难 | 预计算 |
❌ 属性固定
❌ 高频聚合查询
❌ 强事务一致性
✅ 适合:属性极多、变化频繁、稀疏
如果你愿意,我可以:
你现在是哪种使用场景?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。