1. 程式人生 > >關系型數據庫中常用的表設計

關系型數據庫中常用的表設計

handle info 操作日誌 tar header() 通過 管理 title 入參

1.字典表(sys_dict)

作用:用於存放多組值不變的基礎數據,只對系統提供查詢功能.

技術分享圖片

*記錄的新增、更新、刪除都是通過手動進行操作.

*其中dict_code為dict_title的編碼,相同dict_title的記錄為同一組基礎數據,每組基礎數據下又有多對dict_value與dict_name.

*每組基礎數據可以根據實際的業務需求在程序中創建對應的枚舉類(value和name屬性).

2.系統配置表(sys_config)

作用:用於存放系統的配置項,某些業務邏輯需要根據配置項的值來做出相應的處理.

技術分享圖片

*記錄的新增、刪除都是通過手動進行操作.

*在系統配置頁面中查詢配置項並修改配置項的值.

*在某些業務邏輯中需根據模塊ID和配置代碼查詢配置項,根據不同的配置值做出相應的處理.

*可以創建一個枚舉類存放模塊ID,創建常量類存放config_code.

3.地域表(sys_area)

作用:用於存放省市區地域數據,一般只對系統提供查詢功能.

技術分享圖片

*記錄的新增、更新、刪除都是通過手動進行操作.

*在頁面中通過多級聯動選擇地域,調用根據父編碼查詢記錄的API(首次查詢父編碼為0的記錄表示頂層節點)

4.RBAC

用戶表(sys_user)

技術分享圖片

角色表(sys_role)

技術分享圖片

菜單表(sys_menu)

技術分享圖片

*若使用Shiro安全管理框架,則在實現Realm的doGetAuthorizationInfo()方法中,通過用戶的Principal查詢用戶擁有的Role以及Permission各存放到Set集合中返回給SecurityManager,在Controller中通過註解或XML配置的方式設置資源必須擁有指定的role或permission時才能訪問.

*登錄接口校驗成功後需要返回用戶的個人信息以及擁有的角色給前端進行頁面元素的控制.

用戶角色關聯表(sys_user_role)

技術分享圖片

*其中user_id和role_id為聯合主鍵,可以保證一個用戶不會存在相同的角色.

*當在頁面查看用戶擁有的角色時,調用後臺API通過用戶ID查詢用戶擁有的角色以及系統所有的角色,後臺進行雙重遍歷,當用戶擁有目標角色時flag設置為ture,供前端checkbox渲染.

*當在頁面為用戶新增或移除角色時,調用後臺API傳遞選中的角色實體,後臺可以刪除用戶擁有的所有角色再進行批量入庫或者相對當前用戶判斷新增和刪除了哪些角色再進行分步SQL操作.

角色菜單關聯表(sys_role_menu)

技術分享圖片

*其中role_id和menu_id為聯合主鍵,可以保證一個角色不會存在相同的權限.

*當在頁面查看角色擁有的權限時,調用後臺API通過角色ID查詢角色擁有的權限以及系統所有的權限,後臺進行雙重遍歷,當角色擁有目標權限時flag設置為ture,供前端checkbox渲染.

*當在頁面為角色新增或移除權限時,調用後臺API傳遞選中的權限實體,後臺可以刪除角色擁有的所有權限再進行批量入庫或者相對當前角色判斷新增和刪除了哪些權限再進行分步SQL操作.

5.機構表(sys_office)

作用:用於存放公司的組織架構關系(適用於集團)

技術分享圖片

*新增記錄時前端需要傳遞新增的機構信息以及父機構ID,後臺將會根據父ID查詢機構實體,獲取其所有的父ID,構造本次新增機構實體的所有父ID,最終進行入庫操作.

*刪除記錄時前端需要傳遞要刪除的機構ID,後臺將刪除本機構及其所有子機構,只要所有的父ID中包含要刪除的機構ID則也應被刪除.

6.系統操作日誌(sys_log)

作用:用於記錄用戶在系統中的操作行為.

*系統操作日誌功能一般會進行日誌的輸出以及數據的入庫.

*系統操作日誌表由於數據量眾多,因此需要在查詢參數中添加索引.

技術分享圖片

*利用攔截器的afterCompletion方法實現系統操作日誌(在請求被響應之後調用)

1.通過afterCompletion方法的handler參數獲取訪問控制層對應方法的Method對象,通過反射獲取標註在控制層方法的@RequirePermissions註解中的value屬性,再通過此屬性從菜單表中獲取對應的操作名稱.

2.通過afterCompletion方法的HttpServletRequest參數的getRemoteAddress()方法獲取客戶端遠程IP、getHeader()方法獲取HTTP請求頭中的user-agent參數、getRequestURI()方法獲取請求URL、getParameterMap()方法獲取請求體中的參數、getMethod()方法獲取HTTP請求方法.

3.通過判斷afterCompletion方法的Exception參數是否為空來確定此處請求是否成功,若Exception參數不為空則獲取異常中的信息保存進庫中.

*afterCompletion方法中應使用異步的方式新建一個線程進行日誌的記錄.

*使用攔截器實現系統操作日誌功能的好處是可以通過HttpServletReqeust實體獲取更多關於客戶端的信息,缺點是不易擴展,只能通過鍵值對的形式獲取請求參數.

技術分享圖片

*利用Spring AOP的環繞通知實現系統操作日誌.

1.切入點為Service層中的業務方法.

2.當Service層中的方法執行前將會進入切面中的環繞通知方法,可以通過ProceedingJoinPoint的getArgs()方法獲取連接點的參數集,在此時可以根據記錄ID查詢數據庫中變更前的記錄實體.

3.執行ProceedingJoinPoint的process()方法調用連接點,方法的返回值為連接點的返回值,若執行成功且無異常則可以判斷變更前和變更後哪些屬性發生了變化,最後進行入庫操作.

*可以直接在連接點的前後簡單的把入參和返回值進行打印.

*使用AOP實現日誌的好處是不影響原有的代碼結構、可以很容易的得到方法執行的參數和返回值、易擴展,可以配置不同的切入點來做不同的邏輯處理,缺點是不能獲取更多關於客戶端的信息.

關系型數據庫中常用的表設計