EAV(Entity–Attribute–Value,实体–属性–值)模型是一种用来存储高度动态、稀疏、属性不固定的数据的数据库设计模式,常用于电商商品参数、医疗病历、自定义表单等场景。
下面从核心思想 → 表结构设计 → 常见变体 → 优缺点 → 设计建议系统讲一下。
传统表结构:
产品( id, 名称, 颜色, 尺寸, 重量 )
问题:属性经常变,加字段成本高。
EAV 思路:
把“列”变成“行”。
entity (
id BIGINT PRIMARY KEY,
type VARCHAR(50) -- 如 product / patient
)
attribute (
id BIGINT PRIMARY KEY,
name VARCHAR(100), -- 颜色
data_type VARCHAR(20) -- string / int / decimal / date
)
entity_attribute_value (
entity_id BIGINT,
attribute_id BIGINT,
value_string VARCHAR(255),
value_number DECIMAL,
value_date DATE,
PRIMARY KEY (entity_id, attribute_id)
)
✅ 一个实体可以有任意多个属性
❌ 值类型需要分列或用统一类型(如 TEXT)
value TEXT
eav_string_values
eav_int_values
eav_decimal_values
eav_date_values
entity (
id,
attributes JSONB
)
配合 EAV 表做索引和查询。
SELECT e.id
FROM entity e
JOIN eav v1 ON e.id = v1.entity_id
JOIN attribute a1 ON v1.attribute_id = a1.id
JOIN eav v2 ON e.id = v2.entity_id
JOIN attribute a2 ON v2.attribute_id = a2.id
WHERE a1.name = '颜色' AND v1.value_string = '红'
AND a2.name = '重量' AND v2.value_number > 1
⚠️ 多属性查询会产生大量 JOIN
product (
id,
name,
price,
-- 动态参数用 EAV
)
INDEX (attribute_id, value_number)
product_view AS
SELECT ...
让业务层“看起来像宽表”
✅ 适合:
❌ 不适合:
如果你愿意,我可以:
你现在是打算用在什么系统里?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。