# 用户管理
---
先罗列一些比较好的文章,后期我再自己整理两套:简单版、专业版。
[传送门:参阅经典的RBAC模型](https://blog.csdn.net/yangwenxue_admin/article/details/73936803)
[传送门:数据库表设计规范——阿里JAVA实现(地址每天在变~)](https://alitech-private.oss-cn-beijing.aliyuncs.com/1528269849853/Java_manual.pdf?Expires=1539577726&OSSAccessKeyId=LTAIgu8IHyutlWfc&Signature=EsxEUUHwo12BP8/HdmHrPkPBUS0%3D)
[传送门:UML建模](https://blog.csdn.net/soft_zzti/article/details/79811923)
[传送门:UML时序图](https://www.cnblogs.com/cy568searchx/p/6227238.html)
<br>
为了方便设计(手册里好多正反例,适合学习,不适合开发),我简单整理一下:
mysql规约(以下全部强制)
建表规约
1. 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint
2. 表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。
数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
3. 表名不使用复数名词
4. 禁用保留字,如 desc、range、match、delayed 等,请参考 MySQL 官方保留字
5. 主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名
6. 小数类型为 decimal,禁止使用 float 和 double
7. 如果存储的字符串长度几乎相等,使用 char 定长字符串类型
8. varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长度大于此
值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。
9. 表必备三字段:id, gmt_create, gmt_modified
10. 表的命名最好是加上“业务名称_表的作用”
11. 库名与应用名称尽量一致
12. 如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释
13. 字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循:
1)不是频繁修改的字段
2)不是 varchar 超长字段,更不能是 text 字段
14. 单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表
索引规约
15. 业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引
16. 超过三个表禁止 join。需要 join 的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引
17. 在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可
18. 页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决
19. 如果有 order by 的场景,请注意利用索引的有序性。order by 最后的字段是组合索引
的一部分,并且放在索引组合顺序的最后,避免出现 file_sort 的情况,影响查询性能
20. 利用覆盖索引来进行查询操作,避免回表
21. 利用延迟关联或者子查询优化超多分页场景
22. SQL 性能优化的目标:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts最好
23. 建组合索引的时候,区分度最高的在最左边
24. 防止因字段类型不同造成的隐式转换,导致索引失效
25. 创建索引时避免有如下极端误解:
1)宁滥勿缺。认为一个查询就需要建一个索引。
2)宁缺勿滥。认为索引会消耗空间、严重拖慢更新和新增速度。
3)抵制惟一索引。认为业务的惟一性一律需要在应用层通过“先查后插”方式解决。
SQL 语句
26. 不要使用 count(列名)或 count(常量)来替代 count(*),count(*)是 SQL92 定义的标准统计
行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关
27. count(distinct col) 计算该列除 NULL 之外的不重复行数,注意 count(distinct col1, col2) 如
果其中一列全为 NULL,那么即使另一列有不同的值,也返回为 0
28. 当某一列的值全是 NULL 时,count(col)的返回结果为 0,但 sum(col)的返回结果为NULL,
因此使用 sum()时需注意 NPE 问题
29. 使用 ISNULL()来判断是否为 NULL 值
30. 在代码中写分页查询逻辑时,若 count 为 0 应直接返回,避免执行后面的分页语句
31. 不得使用外键与级联,一切外键概念必须在应用层解决
32. 禁止使用存储过程,存储过程难以调试和扩展,更没有移植性
33. 数据订正(特别是删除、修改记录操作)时,要先 select,避免出现误删除,确认无误才能执行更新语句
34. in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控制在 1000 个之内
35. 如果有国际化需要,所有的字符存储与表示,均以 utf-8 编码,注意字符统计函数的区别
ORM 映射
36. 在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明
37. POJO 类的布尔属性不能加 is,而数据库字段必须加 is_,要求在 resultMap 中进行字段与属性之间的映射
38. 不要用 resultClass 当返回参数,即使所有类属性名与数据库字段一一对应,也需要定
义;反过来,每一个表也必然有一个 POJO 类与之对应
39. sql.xml 配置参数使用:#{},#param# 不要使用${} 此种方式容易出现 SQL 注入
40. iBATIS 自带的 queryForList(String statementName,int start,int size)不推荐使用
41. 不允许直接拿 HashMap 与 Hashtable 作为查询结果集的输出
42. 更新数据表记录时,必须同时更新记录对应的 gmt_modified 字段值为当前时间
43. 不要写一个大而全的数据更新接口。传入为 POJO 类,不管是不是自己的目标更新字段,都
进行 update table set c1=value1,c2=value2,c3=value3; 这是不对的。执行 SQL时,不要更新无
改动的字段,一是易出错;二是效率低;三是增加 binlog 存储
服务器
45. 高并发服务器建议调小 TCP 协议的 time_wait 超时时间
46. 调大服务器所支持的最大文件句柄数(File Descriptor,简写为 fd)
47. 给 JVM 环境参数设置-XX:+HeapDumpOnOutOfMemoryError 参数,让 JVM 碰到 OOM 场景时输出 dump 信息
48. 在线上生产环境,JVM 的 Xms 和 Xmx 设置一样大小的内存容量,避免在 GC 后调整堆大小带来的压力
49. 服务器内部重定向使用 forward;外部重定向地址使用 URL 拼装工具类来生成,否则会带
来 URL 维护不一致的问题和潜在的安全风险
<br>
设计规约
1. 存储方案和底层数据结构的设计获得评审一致通过,并沉淀成为文档。
2. 在需求分析阶段,如果与系统交互的 User 超过一类并且相关的 User Case 超过 5 个,使用用例图来表达更加清晰的结构化需求
3. 如果某个业务对象的状态超过 3 个,使用状态图来表达并且明确状态变化的各个触发条件
4. 如果系统中某个功能的调用链路上的涉及对象超过 3 个,使用时序图来表达并且明确各调用环节的输入与输出
5. 如果系统中模型类超过 5 个,并且存在复杂的依赖关系,使用类图来表达并且明确类之间的关系
6. 如果系统中超过 2 个对象之间存在协作关系,并且需要表示复杂的处理流程,使用活动图来表示
7. 需求分析与系统设计在考虑主干功能的同时,需要充分评估异常流程与业务边界
8. 类在设计与实现时要符合单一原则
9. 谨慎使用继承的方式来进行扩展,优先使用聚合/组合的方式来实现
10. 系统设计时,根据依赖倒置原则,尽量依赖抽象类与接口,有利于扩展与维护
11. 系统设计时,注意对扩展开放,对修改闭合
12. 系统设计阶段,共性业务或公共行为抽取出来公共模块、公共配置、公共类、公共方法
等,避免出现重复代码或重复配置的情况
13. 避免如下误解:敏捷开发 = 讲故事 + 编码 + 发布
14. 系统设计主要目的是明确需求、理顺逻辑、后期维护,次要目的用于指导编码
15. 设计的本质就是识别和表达系统难点,找到系统的变化点,并隔离变化点
16. 系统架构设计的目的:
1)确定系统边界。确定系统在技术层面上的做与不做。
2)确定系统内模块之间的关系。确定模块之间的依赖关系及模块的宏观输入与输出。
3)确定指导后续设计与演化的原则。使后续的子系统或模块设计在规定的框架内继续演化。
4)确定非功能性需求。非功能性需求是指安全性、可用性、可扩展性等。
- 2023-4-8__成长之路
- 技术杂谈
- 程序员境界
- 走进猿类
- 做一个程序员
- 什么是猿类
- 爱乱吹的猿
- 业余生活
- 我的书架
- 高效程序员的45个习惯
- 敏捷—高效软件开发之道
- 态度决定一切
- 学无止尽
- 交付用户想要的软件
- 敏捷反馈
- 敏捷编码
- 敏捷调试
- 艺术人生
- 摘自艺术的境界
- 如何欣赏画
- 《的》
- 我的文档
- 小白学习前那些说不完的事
- 计算机语言都一样
- 尝试理解他人代码
- 做为旁观者的思考
- 怎样才算懂计算机
- 工欲善其事,必先利其器
- 教案日志
- 十天学电脑
- 一,认识计算机
- 二、认识编程语言
- 三、认识程序内涵
- 四,认识数据结构
- 五、认识电脑系统
- 六、认识通信原理
- 七、邮箱管理
- 八、重新审视电脑
- 九、理解终生学习
- 十、感悟三千世界
- c语言
- C语言——我觉得好简单
- c学好不怕没饭碗—2014.7.21
- C语言——我想的有点儿简单
- 或多或少的c语言知识
- c语言初探篇
- 初探c语言底层
- 初探整型和浮点型
- 初探二进制数---原反补移
- 初探有无符号
- 初探c是如何跑起来的
- 初探指针
- 初探数组
- 初探顺序表
- 初探栈,队列
- 初探c语言编程
- c语言进阶篇
- c语言自身的那些事
- 结构详解
- c语言大成篇
- 人类思维——模式匹配
- 论c语言面试
- 数据结构
- 核心概念,没有之一顺序表
- 线性表代码实现
- Sq_list
- 不存在的链表
- 只是一种思想——栈
- 只是一种思想——队列
- 不存在的树
- 只是一种思想——二分法
- 不存在的图
- 算法原理
- 傅里叶变换
- 算法导论
- 算法导论——c语言实现
- 算法导论——java实现
- 组成原理
- 操作系统
- 初探操作系统
- 深究操作系统
- 操作系统如何跑起来
- 进程就像细胞
- 系统就像生命
- 进程树pstree
- 进程
- 进程何时更名为生命
- 初探进程映像
- 程序如何成为进程映像
- PCB
- PCB解读之——信号量(p_sig)
- 进程同步
- 进程通信
- 进程调度
- 用户
- PPDA
- 存储系统
- I/O系统
- 网络原理
- 通信简史
- 通信是网络基础
- 趣谈网络
- 自我介绍
- 快递公司
- 小D的自述
- 网络架构
- OSI/RM
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
- TCP/IP四层模型
- 五层模型
- 网络划分
- IP史
- 信息安全
- 社会工程学
- 信息收集
- 诱导
- 伪装
- 如何成为任何人
- 社会心理学
- 思维模式
- 说服的力量
- 代码审计
- 灾难恢复
- 安全注入
- 网络工程
- 802.11
- CCNA
- CWNA
- 社会工程
- 社会心理
- 信息诱导
- 身份伪装
- 系统框架
- web前端框架
- smarty框架
- bootstrap框架
- thinkphp框架
- zend框架
- yii框架
- ci框架
- 网站开发
- 五大难题
- 网站工作原理
- 数据库原理
- 服务器原理
- 前端开发
- 前端技能基础
- html
- css
- javascript
- 浏览器兼容
- 前端总结
- 后台开发
- 或多或少的JS
- js初探篇
- 理解Javascript
- JS继承
- 数组
- 操作方法
- DOM事件
- 数据传输
- JS面试题
- 数据对象
- 学生管理系统
- 学生管理首页
- 粗略学了一遍后的总结
- 零碎知识
- js初探篇第二版
- javascript构成
- 基本类型
- 基本语句与判断类型
- 基本对象与操作函数
- 基本判断与甄别数据
- 内置对象与操作函数
- 对象认识与深浅复制
- DOM级别与BOM
- 严格模式与混杂模式
- ES5和ES6
- js进阶篇
- 上传图片
- js实战篇
- 或多或少的PHP
- 详解url结构
- html基础
- html初识
- html-组成页面的基础标签
- ie兼容
- 教学方法
- 论php——编程思想
- 论php——底层实现
- 中华国学
- 易经
- 黄帝内经
- 山海经
- 道德经
- 骗经
- 中华哲学
- 一花一世界
- 道可道非常道
- 一瞬
- 宇宙
- 心得体会
- 电脑叫智能生命体更准确
- 计算机不是汉语模式
- 琐事日记
- 成长与人性
- 祝单身狗快乐
- 人其实过的很单薄
- 都怪自己不够优秀
- 那是几个人的世界
- 认清世界,认清自己
- 陪伴繁华逝去的平凡
- 俯拾仰取
- 技术手册
- 网站开发
- 准备工作
- firewalld
- mysql
- redis
- 开发流程
- 整体配置
- 环境配置
- tomcat配置
- 数字证书配置
- 项目配置
- 数据设计
- 用户管理
- 整站设计
- user
- user_group
- user_role
- 服务端
- 了解学习
- quartz
- HelloWorld
- HelloJob
- HelloQuartz
- HelloScheduler
- Job
- JobDataMap
- Trigger
- Scheduler
- properties
- spring
- AOP
- 使用
- svnkit
- svn init
- FSFS
- server
- Java
- 测试
- 任务调度
- 网站架构
- 网站前端
- pc端
- 移动端
- native
- ios
- android
- ipad
- hybrid
- 技术日志
- 2018-9-26
- 2018-11-26
- 资源收集
- UED资源
- 技术架构
- 云平台
- 工作方面
- 实习工作经验
- 草稿1
- 草稿2
- 草稿3
- 草稿4
- 草稿5
- 草稿6
- 草稿7
- 大学总结
- 面经
- 一、职能定位
- 细节
- 前端
- 工作总结
- 简历
- 职业规划
- 一年规划
- 整理归档
- 2015/11/10以前
- 2015/11/10
- 2015/11/11
- 2015/11/12
- 2015/11/13
- 2015/11/14
- 2015/11/15与16
- 2015/11/17
- 2015/11/18
- 2015/11/19与20
- 2015/11/21
- 2015/11/22
- 2015/11/23
- 2015/11/24
- 2015/11/25
- 2015/11/26
- 2015/11/27
- 2015/11/28
- 2015/11/29
- 2015/11/30-12/6
- 2015/12/7-2016/4/18
- 2016/4/19
- 2016/4/20~2017/6/27
- 2017/6/28-2017/7/4
- 2017/7/5-2018/1/11
- 2018/1/12
- 2018/1/13-2018/4/19
- 2018/4/20
- 2018/4/21-2018/5/10
- 2018/5/11
- 2018/5/12-2018/5/16
- 2018/5/17-2018/5/30
- 2018/5/30-2018/10/15
- 2018/10/15-2018/10/18
- 2018/10/19-2018/11/17
- 2018/11/17-2018/12/31
- 结束----------------开始
- 2019/2/18
- 2020/7/30
- 2020/9/5
- 2021/5/6
- 回收站
- 以前文件
- 2015-10-17__成长之路
- 2018-10-15__成长之路
- 2020-3-29__成长之路
- 毕业三年总结
- 浙大之旅
- 2020
- 英语
- 基础3000单词
- 第一周
- 百词斩__126
- 百词斩__126翻译
- 百词斩__252
- 百词斩_252翻译
- 百词斩__392
- 百词斩__532
- 百词斩__672
- 第二周
- 百词斩__812
- 听力
- 新东方演讲稿
- 库克杜克大学演讲全文版
- 库克杜克大学演讲演讲英文对照版