目录
1、库存表设计
参考文档:电商ERP系统——商品SKU与库存设计
商品属性表:由属性名与属性值共同构成商品的一个属性,属性名 atrr_name_id 是product_attr_name的一个外键,而atrr_value_id 是product_attr_value一个外键。
因为不同的商品它们的属性有很多不同,共同的部分抽象进商品表中,不同的部分可以存储到这个product_attr表中。
商品属性名表:对商品属性进行抽象,抽象元数据,属性名、是否sku、是否颜色、是否支持搜索、是否启用、属性类型
商品属性值表:存储对应商品属性名相应的属性值,如果是单选、多选,则是多个值
商品sku表:存储对应商品sku信息
1.1、案例讲解
有一个product_id=1的商品,它有两种规格: 红色:L款、红色:M款需要录入库存
我们要查询sku_id=1的具体规格相关参数,
得到sku_attr_ids为"1:2",我们将其处理成一个数组[1,2]
SELECT
n.attr_name,
v.attr_value_content
FROM
product_attr t
LEFT JOIN product_attr_name n ON t.attr_name_id = n.attr_name_id
LEFT JOIN product_attr_value v ON t.attr_value_id = v.attr_value_id
WHERE
t.attr_id IN ( 1, 2 );
执行结果如下:
1.2、优势与劣势
1.2.1 优势
1、对sku有比较好的支持,可以从多个属性角度来自定义规格、库存、价格
2、对商品属性进行统计比较方便
1.2.2 劣势
1、表设计过于复杂了,查询一个商品多的规格库存,需要联表查询至少4张表
2、商品评论表设计
例如,有这么一个评论场景:
用户1:这是一个比较好的商品
用户2:你骗人,我用了,效果不好
用户1:真的,你是不是使用方法不对?
用户3:我不想评论
3、用户登录表设计
用户表设计这一块主要描述一下,如果支持多种登录方式,我们设想一下,系统刚开始运行时,我们系统只有一个认证模式:即用户名密码认证。随着后期系统的扩展,
可能会有手机短信验证码登录、邮箱登录、第三方登录(QQ、微信、百度账号、Github)等等,当需要支持这些登录方式式,我们系统肯定需要存储这些登录方式的身份与凭证
信息,我们肯定不太愿意在用户表主表中增加这些字段,因为维护性与扩展性非常不好,每次对接都需要在用户表中增加对应的扩展字段,扩展性非常差。
下面我给我们电商系统中,设计的用户登录相关的表,用户表与第三方登录表:
用户表:
第三方登录表结构:
CREATE TABLE `u_third_login` (
`id` bigint(20) NOT NULL COMMENT '主键',
`principal` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '身份',
`credential` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '凭证',
`login_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '登录类型(1:手机号/验证码;2:QQ登录;3:微信登录-PC扫码);4:微信登录-公众号登录)',
`u_user_id` bigint(20) DEFAULT NULL,
`ext` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '扩展字段信息(通常以json存储)',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='第三方登录表';
第三方登录表数据示例:
当我们需要对接一种新的第三方时,仅仅需要在login_type中维护一个新的枚举项即可,该新的登录类型所需要的扩展信息,可以存储到ext字段中,以微信登录-PC扫码登录为例,openId作为身份信息字段存储到principal中,
而凭证信息暂时没有不需要存储,ext字段中可以存储unionid、nickname、openid等原始信息。