EAV(Entity–Attribute–Value,实体-属性-值)模型本身就是为了“动态扩展字段”而设计的,所以所谓“扩展字段”,在 EAV 里通常不是改表结构,而是新增属性定义。
下面从「怎么扩」「常见方式」「示例代码」「注意事项」四个层面说明。
典型 EAV 三张表:
entity:实体(如用户、商品)attribute:属性定义(字段元信息)value:属性值(按类型分表或统一存)entity
id | type
----|------
1 | user
attribute
id | entity_type | name | type
----|-------------|-----------|------
1 | user | age | int
2 | user | nickname | string
value
entity_id | attribute_id | value
-----------|--------------|--------
1 | 1 | 18
1 | 2 | tom
不需要 ALTER TABLE
INSERT INTO attribute (entity_type, name, type)
VALUES ('user', 'wechat_openid', 'string');
使用:
INSERT INTO value (entity_id, attribute_id, value)
VALUES (1, 3, 'oXYZ123');
✅ 优点
避免 value 表过大或类型混乱:
value_int
value_string
value_datetime
value_decimal
新增字段时:
attribute 指定 typevalue_xxx 表适合后台表单:
attribute_group
id | name
----|------
1 | 基础信息
2 | 扩展信息
attribute_group_item
group_id | attribute_id
在 attribute 表里加字段:
attribute
validate_rule
default_value
is_required
visible
这样“扩展字段”还能带行为。
INSERT INTO attribute
(entity_type, name, type, is_required)
VALUES ('user', 'phone', 'string', 1);
INSERT INTO value_string
(entity_id, attribute_id, value)
VALUES (1, 10, '13800000000');
SELECT
e.id,
MAX(CASE WHEN a.name='phone' THEN v.value END) AS phone
FROM entity e
JOIN value_string v ON v.entity_id = e.id
JOIN attribute a ON a.id = v.attribute_id
GROUP BY e.id;
EAV 扩展字段 = 加一条 attribute 记录,而不是加一列。
如果你愿意,我可以:
你现在是打算用在哪类业务?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。