发表于: 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';
评论