温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

EAV模型如何存储数据

发布时间:2026-09-01 01:08:01 来源:亿速云 阅读:96 作者:小樊 栏目:数据库

EAV(Entity-Attribute-Value,实体-属性-值)模型是一种用来在列结构不固定或属性经常变化的情况下存储数据的数据库建模方式,常用于商品属性、医疗记录、配置项等场景。


一、EAV 模型的核心思想

传统表结构:

用户表:id, name, age, email

如果以后要加“身高”“爱好”,就要改表结构。

EAV 不把属性做成列,而是做成行:

实体(Entity) + 属性(Attribute) + 值(Value)

二、EAV 的基本表结构

1️⃣ 实体表(Entity)

entity (
  id        INT PRIMARY KEY,
  type      VARCHAR(50)  -- 如 user / product
)

2️⃣ 属性表(Attribute)

attribute (
  id        INT PRIMARY KEY,
  name      VARCHAR(50),  -- 如 age, email
  data_type VARCHAR(20)   -- int / string / date
)

3️⃣ 值表(Value)

entity_attribute_value (
  entity_id    INT,
  attribute_id INT,
  value        VARCHAR(255),
  PRIMARY KEY (entity_id, attribute_id)
)

三、数据存储示例

传统方式

user
id | name | age | email
1  | Tom  | 20  | a@x.com

EAV 方式

entity
id | type
1  | user

attribute
id | name  | data_type
1  | name  | string
2  | age   | int
3  | email | string

entity_attribute_value
entity_id | attribute_id | value
1         | 1            | Tom
1         | 2            | 20
1         | 3            | a@x.com

✅ 新增属性不需要改表结构,只插数据。


四、查询示例

查询 Tom 的所有属性

SELECT a.name, v.value
FROM entity_attribute_value v
JOIN attribute a ON v.attribute_id = a.id
WHERE v.entity_id = 1;

转成“宽表”(Pivot)

SELECT
  MAX(CASE WHEN a.name='name' THEN v.value END) AS name,
  MAX(CASE WHEN a.name='age' THEN v.value END) AS age
FROM entity_attribute_value v
JOIN attribute a ON v.attribute_id = a.id
WHERE v.entity_id = 1;

五、EAV 的优缺点

✅ 优点

  • 属性动态扩展
  • 适合稀疏数据(很多属性为空)
  • 非常适合配置型、元数据驱动系统

❌ 缺点

  • 查询复杂(大量 JOIN)
  • 性能较差
  • 类型不安全(value 通常是字符串)
  • 数据校验困难

六、常见优化方式

  • 按实体类型分表
  • 使用 JSON 字段(MySQL / PostgreSQL)
  • EAV + 宽表混合存储
  • 只在真正动态属性上使用 EAV

如果你愿意,我可以:

  • 用 商品 SKU 举例
  • 对比 EAV vs JSON
  • 给你一个 完整建表 + 示例 SQL
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手