数据表结构设计
关系设计
为什么不用外键?
分库分表有外键会非常麻烦,清洗数据也很麻烦。数据库内置触发器也不适合采用。
查业务问题的后悔药——时间戳更多Java学习教程+薇老师:hua2021ei
create_time 数据创建时间
update_time 数据更新时间
可以用于查询业务,主要要存储datetime类型。
用户模块
用户表
create table mmall_user(
id int(11) PRIMARY key not null auto_increment comment '用户表id',
username varchar(50) not null comment '用户名',
password varchar(50) not null,
email varchar(50) DEFAULT null,
phone varchar(50) DEFAULT null,
question VARCHAR(100) DEFAULT null,
answer varchar(100) DEFAULT null,
role int(4) not null,
create_time datetime not null,
unique key user_name_unique (username) using btree
)engine=INNODB auto_increment=21 DEFAULT charset=utf8
用户名username设置为唯一索引unique
由于用户名是不能重复的,在并发的时候可以通过锁的形式解决,但是当架构变成分布式后,通过数据库底层的unique key唯一索引,交给mysql完成了唯一的验证。
涉及知识点
- 横向越权、纵向越权安全漏洞
横向越权:攻击者尝试访问与他拥有相同权限的用户的资源
纵向越权:低级别攻击者尝试访问高级别用户的资源
- 高复用服务响应对象的设计思想及抽象封装
- MD5明文加密及增加salt值
关于MD5网上又很多资料,是一个安全得散列算法,虽然过程不可逆,但是还是可以通过穷举法获取原值
增加salt值(加盐值)可以一定程度上解决上面得问题,具体得看
- Guava缓存的使用
package com.mmall.common;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.TimeUnit;
public class TokenCache {
public static final String TOKEN_PREFIX = "token_";
private static Logger logger = LoggerFacto