发表于: 2020-08-25 23:50:52

1 1278


今天完成的事情

1. 用户、角色、权限的设计思考

2. SQL WHERE 子句组合查询


收获

1. 用户表与第三方登录方式的扩展

在实际的项目中往往用户有多种登录与注册的途径,有很多第三方的登录方式。那么如何在用户表设计之初考虑到认证方式的扩展,在对接新的第三方登录方式的时候尽可能的减少对数据表的修改呢?

最佳实践是将用户基础信息表与登录方式表分开来。

用户基础信息表:

user

CREATE TABLE `user`(

`id` bigint(10) UNSIGNED NOT NULL AUTO_INCREMENT,

`nick_name` varchar(20) NOT NULL COMMENT '用户昵称',

`avatar` varcher(60) COMMENT '头像',

PRIMARY KEY (`id`) USING BTREE

)ENGINE = InnoDB;


user_auths

CREATE TABLE `user_auths`(

`id` bigint(10) UNSIGNED NOT NULL AUTO_INCREMENT,

`user_id` bigint(10) UNSIGNED NOT NULL COMMENT '用户昵称',

`identity_type` varcher(60) NOT NULL COMMENT '登录方式: wechat/weibo/phone/email...',

`identifier` varcher(60) NOT NULL COMMENT '第三方唯一标识',

`credential` varcher(60) NOT NULL COMMENT '第三方登录凭证',

PRIMARY KEY (`id`) USING BTREE

)ENGINE = InnoDB;


这里的两张表仅仅考虑实现,并不考虑业务问题。

优点:实现了登录方式的横向扩展。

缺点:

登录一次要查两张表。

需要增加用户的注册和注销逻辑的校验(比如注销后验证是否所有登录方式都注销了,是否需要清空用户基础信息表)。


2. SQL 中使用组合 WHERE 子句过滤信息

SQL 允许给出多个 WHERE 子句,这些子句有两种使用方式 AND 和 OR


AND 操作符

SELECT name, price

FROM goods

WHERE type = 'apple' AND price <= 5;


输出的信息一定是符合 WHERE 子句中的两个条件的。

一个 AND 最多只能有两个过滤条件,如果要增加多个过滤条件就需要增加 AND 操作符的数量。


OR 操作符

SELECT name, price

FROM goods

WHERE type = 'apple' OR type = 'banana';


只要符合上述任一条件就会返回,OR 操作符有短路特性,OR 左边的条件被满足就不再判断,直接返回。

同样 OR 操作符也可以多个拼接起来,但是我们可以有更加好的操作符去实现。


AND OR 组合过滤

SELECT name, price

FROM goods

WHERE type = 'apple' OR type = 'banana' AND price <= 5;


组合过滤求值顺序

在组合过滤中需要考虑到操作符优先级的问题,AND 操作符的优先级高于 OR,所以上述 SQL  的语义是符合 type='apple' 或者 type='banana' 并且 price<=5 的数据就可以返回。

当然,尽量不要只靠语法解析器去掌握优先级,我们可以用小括号把条件包起来,最里层的优先级更高。

SELECT name, price

FROM goods

WHERE (type = 'apple' OR type = 'banana') AND price <= 5;


比如在上面这一段中,语义是 type='apple' 或者 type='banana' 并且 price<=5 的数据被选中。


IN 操作符

IN 操作符用来指定范围,范围中的每个条件都可以被匹配。

SELECT name, price

FROM goods

WHERE type IN('apple', 'banana');


我们可以发现 IN 操作符与 OR 操作符完成了同样的事情。

IN 操作符的优点:

    范围更加直观清晰

     IN 操作符一般比一组 OR 操作符执行的更加快

     IN 最大的优势是可以包含其他的 SELECT 语句,更加能够动态的建立 SELECT 语句。


NOT 操作符

在 WHERE 子句中 NOT 操作符有且只有一个功能:否定后面的所有条件。

SELECT name, price

FROM goods

WHERE NOT type='apple';




返回列表 返回列表
评论

    分享到