EAV(Entity-Attribute-Value,实体-属性-值)模型是一种用来处理高度动态、稀疏、属性不固定的数据的数据库设计模式。它常用于电商商品属性、医疗病历、自定义表单、CMS 等场景。
下面从 核心思想 → 表结构设计 → 示例 → 优缺点 → 优化方案 系统讲一下。
传统表结构:
商品(id, 名称, 颜色, 尺寸, 重量)
问题:不同类目商品属性差异巨大,列会爆炸。
EAV 思想:
把“列”变成“行”。
CREATE TABLE entity (
id BIGINT PRIMARY KEY,
entity_type VARCHAR(50) NOT NULL
);
示例:
1, product
2, product
CREATE TABLE attribute (
id BIGINT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
data_type VARCHAR(20) NOT NULL -- string / int / decimal / date
);
示例:
1, color, string
2, size, string
3, weight, decimal
CREATE TABLE entity_attribute_value (
entity_id BIGINT,
attribute_id BIGINT,
value_string VARCHAR(255),
value_number DECIMAL(18,4),
value_date DATE,
PRIMARY KEY (entity_id, attribute_id)
);
✅ 用多列存不同类型,避免类型丢失
✅ 也可用 JSON(见后文)
商品 1
entity: 1, product
EAV:
1, color, value_string='红色'
1, size, value_string='XL'
1, weight,value_number=1.2
商品 2
entity: 2, product
EAV:
2, color, value_string='蓝色'
2, weight,value_number=0.8
➡ 商品 2 没有 size,也不影响结构
value TEXT
问题:类型不安全、查询慢
product_eav
user_eav
减少数据量,提升性能
CREATE TABLE product_attr (
product_id BIGINT,
attrs JSONB
);
适合:
product_flat (
id, color, size, weight
)
➡ EAV 写,宽表读
SELECT e.id
FROM entity e
JOIN entity_attribute_value v1
ON e.id = v1.entity_id
JOIN attribute a1
ON v1.attribute_id = a1.id
WHERE a1.name = 'color'
AND v1.value_string = '红色';
✅ 适合:
❌ 不适合:
如果你愿意,可以告诉我:
我可以直接给你一套可落地的 EAV 表结构 + 查询示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。