EAV(Entity-Attribute-Value,实体-属性-值)模型是一种用来存储稀疏、动态属性的数据建模方式,常见于电商属性、医疗指标、配置项等场景。它的核心表一般长这样:
entity:实体主表(如商品、用户)attribute:属性定义表(属性名、类型、校验规则)value:值表(entity_id, attribute_id, value)在 EAV 中,关联本质上也是属性,只是值的类型是“另一个实体的 ID”。
例如:
所以在 EAV 里做关联,通常有几种方式。
value 表
---------
entity_id
attribute_id
value -- 存的是关联表的 ID
示例:
SELECT v.value
FROM eav_value v
JOIN eav_attribute a ON v.attribute_id = a.id
WHERE v.entity_id = 1001
AND a.code = 'brand_id';
然后:
SELECT * FROM brand WHERE id = <value>;
✅ 优点:简单、通用
❌ 缺点:需要做多次查询或 JOIN,SQL 不直观
attribute 表
--------------
id
code
type -- string / int / entity
ref_entity -- 关联哪张表
查询时:
type = entityref_entity 动态 JOIN适合元数据驱动系统(如低代码平台)
如果关联本身有多重关系、方向、时间等:
entity_relation
----------------
from_entity_id
to_entity_id
relation_type
start_time
end_time
这种方式:
✅ 适合:
在应用层或视图层:
CREATE VIEW product_view AS
SELECT
e.id,
MAX(CASE WHEN a.code='brand_id' THEN v.value END) AS brand_id
FROM entity e
JOIN eav_value v ON e.id = v.entity_id
JOIN eav_attribute a ON v.attribute_id = a.id
GROUP BY e.id;
然后正常 JOIN:
SELECT * FROM product_view p
JOIN brand b ON p.brand_id = b.id;
EAV 里的关联 = 属性值是外键 ID,或单独建关系表;核心关联不建议进 EAV。
如果你有具体场景(比如:商品属性?用户标签?低代码?),我可以直接给你表结构和 SQL 示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。