EAV(Entity-Attribute-Value,实体-属性-值)模型常用于属性高度动态、稀疏、模式不稳定的场景(如电商商品属性、医疗病历、配置系统)。但它的天然缺陷是查询复杂、性能差、类型不安全、JOIN 爆炸。
下面从设计、存储、查询、架构四个层面系统讲“如何优化 EAV”。
不要所有字段都进 EAV
✅ 示例:
用户表:id, name, email(固定)
用户扩展属性:language, theme(EAV)
EAV 一定要配合:
attribute (
id,
name,
data_type,
entity_type,
is_required,
default_value
)
作用:
不要一个 EAV 表存所有实体
product_attribute_value
user_attribute_value
order_attribute_value
✅ 减少行数
✅ 提高索引效率
❌ 反例:
value VARCHAR(255)
✅ 正例:
value_int
value_decimal
value_datetime
value_text
或者:
value_json -- PostgreSQL / MySQL 8
现代数据库下,EAV 的“最优替代”:
attributes JSONB
加上:
GIN INDEX
attributes JSON
✅ 优点:
热数据从 EAV 同步到宽表:
EAV(写)
→ 定时/CDC
→ flat_table(读)
常用于:
❌ 慢:
JOIN 几十次
✅ 优化方式:
GROUP BY + CASEPostgreSQL 示例:
SELECT
entity_id,
jsonb_object_agg(attr_name, value) AS attrs
FROM eav
GROUP BY entity_id;
不要全属性建索引
✅ 只索引:
EAV 不适合搜索
✅ 同步到:
结构:
{
"id": 1,
"name": "手机",
"attrs": {
"color": "black",
"ram": "8G"
}
}
❌ 属性数量稳定
❌ 查询频繁
❌ 强类型要求
✅ 直接用表列或 JSON
EAV 不是用来“替代表”,而是用来“补充表”的。
如果你愿意,可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。