1. 程式人生 > >關係型資料庫中常用的表設計

關係型資料庫中常用的表設計

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實現日誌的好處是不影響原有的程式碼結構、可以很容易的得到方法執行的引數和返回值、易擴充套件,可以配置不同的切入點來做不同的邏輯處理,缺點是不能獲取更多關於客戶端的資訊.