“内容系统偏爱 EAV 模型(Entity–Attribute–Value,实体–属性–值)”这个说法,常见于CMS、电商商品、低代码平台、元数据驱动系统等场景。并不是所有内容系统都“偏爱”EAV,但在结构高度不确定、字段频繁变化、需要通用建模的内容系统中,EAV 确实很常见。
下面从“为什么用”和“代价是什么”两方面说清楚。
内容系统往往要管理:
不同内容类型的字段差异极大,而且业务方经常要加字段。
如果用传统表结构:
article(
id,
title,
body,
author,
seo_keyword,
...
)
每加一个字段就要 ALTER TABLE,在大型系统中成本很高。
EAV 的做法是:
entity = 内容ID
attribute = 字段名
value = 字段值
新增字段只是插入数据,不需要改表结构。
很多内容系统希望:
EAV 天然适合这种元数据驱动思路:
内容类型 = 属性集合
内容实例 = (entity, attribute, value)
低代码、Headless CMS、电商中台几乎都走这条路。
内容系统经常要存:
它们的字段完全不一样,但都希望:
EAV 可以用一张表“装下所有内容”。
例如:
EAV 很容易扩展成:
(entity, attribute, locale, version, value)
传统宽表反而很难。
内容系统“偏爱”EAV,但也常踩坑。
比如取一篇文章的所有字段:
SELECT attribute, value
FROM eav
WHERE entity = 123
再拼成对象,逻辑重。
聚合查询(如“价格 > 100 的内容”)也很痛苦。
value 通常是字符串或 JSON:
成熟内容系统通常不是“纯 EAV”,而是混合:
content(
id,
type,
title,
status,
created_at
)
content_attr(
content_id,
attr_key,
attr_value
)
或
content.extra JSONB
内容系统“偏爱”EAV,本质是因为内容结构不可预测、变化频繁、需要通用建模;
但它用灵活性和扩展性,换来了查询复杂度和性能成本。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。