天天看點

通用權限管理系統元件V3.8功能改進說明 - 對使用者表BaseUser的拆分優化

  最近維護公司的資料庫,使用者表裡的資料有1000多萬條,對使用者表的并發處理非常多,使用者表甚至成了整個系統的瓶頸,經過這次優化維護經驗,深深體會大使用者表的職責不能過多,應該拆分的需要拆分;雖然寫程式需要處理起來很痛苦,但是下定決心還是突破一下正常的設計。

     1:使用者名,密碼盡量不要儲存在一起,就算使用者表被客戶攻破了,也不知道密碼在哪裡。

     2:導入導出資料時,盡量不要把使用者名、密碼全導出出來。

     3:沒有權限的人就是可以看使用者表,也不能操作密碼表。

     4:可以按每個賬戶設定是否進行IP位址通路限制。

     5:可以按使用者設定,是否允許賬戶多使用者同時登入,還是隻能是單使用者登入系統。

     6:使用者表,不要太龐大,友善别人擴充,例如你已經有N多列了,别人都不敢擴充了,字段太超級多了也不好。

     7:使用者安全管理元件,友善內建,不要修改原來的使用者表過多資訊,可以增加一個表,對原來使用者表的變動不要太多,友善內建。

     8:使用者表需要事務處理的部分與其他非事務處理的部分可以分開了,資料庫的瓶頸、壓力分散了,特别是跟一些金額相關的處理部分。

通用權限管理系統元件V3.8功能改進說明 - 對使用者表BaseUser的拆分優化

     資訊系統建設,随着經驗的增長,不斷的有表被拆分,合并,隻有經得起修改的表,才是設計合理的,有生命力的表;随着資訊化系統建設的規模,并發的壓力第表的設計也有很多苛刻的要求,當然要要充分考慮資料安全因素。

     設計良好的系統底層變了,業務邏輯不用變,底層變了調用的部分不變,經得各種折磨的基礎架構才是良好的架構。這是最近幾年對通用權限管理系統元件做的最大的一次改動,使得系統有了能支援千萬級别使用者的資料壓力的牢固基礎。

通用權限管理系統元件V3.8功能改進說明 - 對使用者表BaseUser的拆分優化
通用權限管理系統元件V3.8功能改進說明 - 對使用者表BaseUser的拆分優化

      若不喜歡增強的資訊管理部分,直接删除掉,也影響不大,稍微修改一下,系統也可以平滑運作了,想怎麼改就可以怎麼改。一個系統是否好用 看他是否有足夠的重複利用的價值,也看他是否經得起各種業務系統的需求考驗。代碼是否值得長期維護改進、是否将來也有利用的價值,參考的價值。

  現在拆成2個個表了,可以模仿加表,也可以省事加字段,不會有很邪惡的感覺了,應為在已經有很多字段的表上再加字段,太邪惡了。

     增加表的SQL參考如下:

<a href="http://www.cnblogs.com/jirigala/archive/2013/04/22/3035577.html#">?</a>

<code>USE [UserCenterV38]</code>

<code>GO</code>

<code>SET</code> <code>ANSI_NULLS </code><code>ON</code>

<code>SET</code> <code>QUOTED_IDENTIFIER </code><code>ON</code>

<code>CREATE</code> <code>TABLE</code> <code>[dbo].[BaseUserLogOn](</code>

<code>    </code><code>[Id] [</code><code>int</code><code>] </code><code>NOT</code> <code>NULL</code><code>,</code>

<code>    </code><code>[UserFrom] [nvarchar](50) </code><code>NULL</code><code>,</code>

<code>    </code><code>[UserPassword] [nvarchar](100) </code><code>NULL</code><code>,</code>

<code>    </code><code>[AllowStartTime] [smalldatetime] </code><code>NULL</code><code>,</code>

<code>    </code><code>[AllowEndTime] [smalldatetime] </code><code>NULL</code><code>,</code>

<code>    </code><code>[LockStartDate] [smalldatetime] </code><code>NULL</code><code>,</code>

<code>    </code><code>[LockEndDate] [smalldatetime] </code><code>NULL</code><code>,</code>

<code>    </code><code>[FirstVisit] [smalldatetime] </code><code>NULL</code><code>,</code>

<code>    </code><code>[PreviousVisit] [smalldatetime] </code><code>NULL</code><code>,</code>

<code>    </code><code>[LastVisit] [smalldatetime] </code><code>NULL</code><code>,</code>

<code>    </code><code>[ChangePasswordDate] [smalldatetime] </code><code>NULL</code><code>,</code>

<code>    </code><code>[CommunicationPassword] [nvarchar](100) </code><code>NULL</code><code>,</code>

<code>    </code><code>[SignedPassword] [nvarchar](100) </code><code>NULL</code><code>,</code>

<code>    </code><code>[PublicKey] [nvarchar](200) </code><code>NULL</code><code>,</code>

<code>    </code><code>[MultiUserLogin] [</code><code>int</code><code>] </code><code>NULL</code><code>,</code>

<code>    </code><code>[LogOnCount] [</code><code>int</code><code>] </code><code>NOT</code> <code>NULL</code><code>,</code>

<code>    </code><code>[PasswordErrorCount] [</code><code>int</code><code>] </code><code>NOT</code> <code>NULL</code><code>,</code>

<code>    </code><code>[UserOnLine] [</code><code>int</code><code>] </code><code>NOT</code> <code>NULL</code><code>,</code>

<code>    </code><code>[CheckIPAddress] [</code><code>int</code><code>] </code><code>NOT</code> <code>NULL</code><code>,</code>

<code>    </code><code>[IPAddress] [nvarchar](50) </code><code>NULL</code><code>,</code>

<code>    </code><code>[MACAddress] [nvarchar](50) </code><code>NULL</code><code>,</code>

<code>    </code><code>[OpenId] [nvarchar](50) </code><code>NOT</code> <code>NULL</code><code>,</code>

<code>    </code><code>[Question] [nvarchar](50) </code><code>NULL</code><code>,</code>

<code>    </code><code>[AnswerQuestion] [nvarchar](200) </code><code>NULL</code><code>,</code>

<code>    </code><code>[CreateOn] [smalldatetime] </code><code>NULL</code><code>,</code>

<code>    </code><code>[CreateUserId] [nvarchar](20) </code><code>NULL</code><code>,</code>

<code>    </code><code>[CreateBy] [nvarchar](20) </code><code>NULL</code><code>,</code>

<code>    </code><code>[ModifiedOn] [smalldatetime] </code><code>NULL</code><code>,</code>

<code>    </code><code>[ModifiedUserId] [nvarchar](20) </code><code>NULL</code><code>,</code>

<code>    </code><code>[ModifiedBy] [nvarchar](20) </code><code>NULL</code><code>,</code>

<code> </code><code>CONSTRAINT</code> <code>[PK_BaseUserLogOnInfo] </code><code>PRIMARY</code> <code>KEY</code> <code>CLUSTERED</code>

<code>(</code>

<code>    </code><code>[Id] </code><code>ASC</code>

<code>)</code><code>WITH</code> <code>(PAD_INDEX = </code><code>OFF</code><code>, STATISTICS_NORECOMPUTE = </code><code>OFF</code><code>, IGNORE_DUP_KEY = </code><code>OFF</code><code>, ALLOW_ROW_LOCKS = </code><code>ON</code><code>, ALLOW_PAGE_LOCKS = </code><code>ON</code><code>) </code><code>ON</code> <code>[</code><code>PRIMARY</code><code>]</code>

<code>) </code><code>ON</code> <code>[</code><code>PRIMARY</code><code>]</code>

<code>ALTER</code> <code>TABLE</code> <code>[dbo].[BaseUserLogOn] </code><code>ADD</code>  <code>CONSTRAINT</code> <code>[DF_BaseUserLogOn_MultiUserLogin]  </code><code>DEFAULT</code> <code>((0)) </code><code>FOR</code> <code>[MultiUserLogin]</code>

<code>ALTER</code> <code>TABLE</code> <code>[dbo].[BaseUserLogOn] </code><code>ADD</code>  <code>CONSTRAINT</code> <code>[DF_BaseUserLogOn_CheckIPAddress]  </code><code>DEFAULT</code> <code>((0)) </code><code>FOR</code> <code>[CheckIPAddress]</code>

<code>ALTER</code> <code>TABLE</code> <code>[dbo].[BaseUserLogOn] </code><code>ADD</code>  <code>CONSTRAINT</code> <code>[DF_BaseUserLogOn_OpenId]  </code><code>DEFAULT</code> <code>(newid()) </code><code>FOR</code> <code>[OpenId]</code>

    把原先表裡的資料導入大這個表裡,然後把重複的字段删除就可以了。這樣原先的使用者表變得輕巧了很多,心裡也舒坦了,安全性也提高了N多,好爽。、使用者名與 密碼沒儲存在同一個表裡,應該是不符合很多人習慣,但是大家多思考一下,就可以慢慢都接納了,非常不錯的打破傳統思維的一個小創新。

本文轉自 jirigala 51CTO部落格,原文連結:http://blog.51cto.com/2347979/1188350,如需轉載請自行聯系原作者