# 用戶管理
---
先羅列一些比較好的文章,后期我再自己整理兩套:簡單版、專業版。
[傳送門:參閱經典的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
- 聽力
- 新東方演講稿
- 庫克杜克大學演講全文版
- 庫克杜克大學演講演講英文對照版