EAV(Entity–Attribute–Value,实体-属性-值)模型是一种用来在关系型数据库中存储高度动态、稀疏、属性不固定的数据的设计模式。
下面我用「是什么 → 什么时候用 → 怎么设计 → 示例 → 优缺点 → 常见坑」来说清楚。
传统表结构:
user(id, name, age, email)
列是固定的。
EAV 把“列”变成“行”:
entity | attribute | value
-------|-----------|------
1 | name | Tom
1 | age | 20
2 | email | a@b.com
也就是:
✅ 适合:
❌ 不适合:
entities (
id BIGINT PRIMARY KEY,
type VARCHAR(50) -- user / product
)
attributes (
id INT PRIMARY KEY,
name VARCHAR(50),
data_type VARCHAR(20) -- string / int / datetime
)
entity_values (
entity_id BIGINT,
attribute_id INT,
value_text VARCHAR(255),
value_int INT,
value_datetime DATETIME,
PRIMARY KEY (entity_id, attribute_id)
)
✅ 用多列 value 或 JSON(见后文)
商品 A:
商品 B:
INSERT INTO entity_values VALUES
(1, 1, '红', NULL, NULL),
(1, 2, NULL, 2, NULL),
(2, 3, NULL, 15, NULL);
SELECT a.name, ev.value_text, ev.value_int
FROM entity_values ev
JOIN attributes a ON ev.attribute_id = a.id
WHERE ev.entity_id = 1;
products (
id BIGINT,
attrs JSON
)
SELECT attrs->>'color' FROM products;
✅ 优点:
❌ 缺点:
❌ 把所有数据都 EAV(灾难)
❌ 不做 attribute 表(乱)
❌ 用单 value 列存所有类型
✅ 固定字段仍用普通列
✅ 只把“真正动态”的字段 EAV 化
“EAV 是工具,不是架构”
推荐混合模式:
固定字段 → 普通列
动态字段 → EAV / JSON
如果你愿意,可以告诉我:
我可以直接帮你设计表结构。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。