EAV(Entity-Attribute-Value,实体-属性-值)模型是一种用来在列结构不固定或属性经常变化的情况下存储数据的数据库建模方式,常用于商品属性、医疗记录、配置项等场景。
传统表结构:
用户表:id, name, age, email
如果以后要加“身高”“爱好”,就要改表结构。
EAV 不把属性做成列,而是做成行:
实体(Entity) + 属性(Attribute) + 值(Value)
entity (
id INT PRIMARY KEY,
type VARCHAR(50) -- 如 user / product
)
attribute (
id INT PRIMARY KEY,
name VARCHAR(50), -- 如 age, email
data_type VARCHAR(20) -- int / string / date
)
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
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
✅ 新增属性不需要改表结构,只插数据。
SELECT a.name, v.value
FROM entity_attribute_value v
JOIN attribute a ON v.attribute_id = a.id
WHERE v.entity_id = 1;
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;
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。