ASPNETDB 數據庫關係圖、表和視圖(1) 基本表和獨立表
數據庫關係圖、表和視圖(1) 基本表和獨立表
ASPNETDB 這個隱藏在ASP.NET 2.0四大“插件”
(
SqlMembershipProvider、
SqlRoleProvider、
SqlProfileProvider、
SqlPersonalizationProvider
)
之後,時不時在你App_Data目錄下幽靈般出現的SQL數據庫,其實也並沒什麼神奇之處,
我等凡夫俗子進去一看,原來也不過如此。不過如果我們要編寫自定義Provider的話,
還是得仔細研究一下下的,因爲這4個Provider大部分的業務邏輯還是“封裝”在這個數據庫裏的。
下面,就容我這個老小弟,爲各位兄弟理出裏面的表、視圖和存儲過程。
注:其實還有SqlWebEventProvider,它用到表aspnet_WebEvent_Events和存儲過程aspnet_WebEvent_LogEvent。
因爲老小弟認爲從性能上考慮,寫入本地文件是更好的選擇,所以在此不作介紹。
另外,還有個和ASPNETDB無關的SiteMapProvider,主要配合SiteMapPath 等控件,一般以Xml文件形式存放站點地圖。
看張“地圖”先:
在ASPNETDB數據庫的幾個表中,都有名稱爲Lowered***的字段,
這些字段用來存放***字符串字段的小寫形式副本。
因爲這些***字符串字段的比較都是不區分大小寫,在表中存放一個小寫形式副本,
能提高字符串比較的速度。
基本表 aspnet_Application、aspnet_Users
-
應用程序表
每個Provider都有一個ApplicationName屬性,該屬性一般定義在web.config中。
舉一個ProfileProvider的例子(其餘3個Provider也一樣):
<system.web>
...
<connectionStrings>
<add connectionString="..."/>
</connectionStrings>
...
<profile defaultProvider="SqlSrvProfileProvider">
<providers>
<add
type="System.Web.Security.SqlProfileProvider"
connectionStringName="SqlSrvConnectionString"
applicationName="WebShop"
commandTimeout="30"
description="SqlSrvProfileProvider" />
</providers>
<properties>
...
</properties>
</profile>
...
</system.web>
這樣你就爲你的應用程序註冊了一個"WebShop"名稱
(也可以不明確配置applicationName值,默認爲應用程序的虛擬根路徑,即"/")。
要注意的是如果你那天把"WebShop"改成了"WebShop1"
(改成"webshop"、"webShop"等就和沒改一樣,因爲應用程序名稱是不區分大小寫的),
你以前的用戶自定義屬性值就人間蒸發了,因爲ProfileProvider把"WebShop1"
當作一個新的應用程序又新註冊了一遍(這時候看過我這篇文章的兄弟
就該知道怎麼辦了,哈哈)。
那4個Provider是否一定要配置成同樣的applicationName呢?當然不必要啦!
你爲每個Provider各建一個數據庫都沒有關係,何況區區applicationName值呢。
不過在此老小弟建議各位兄弟,別沒事找事,還是取一樣的名稱好。 -
基本用戶表
表中MobileAlias字段(以及用戶成員資格表aspnet_MemberShip中的MobilePIN字段),
沒見在那裏用到。老小弟猜想微軟這樣做有兩種可能:一種是想以後帳戶和手機綁定,
另一種可能就是爲手機上網而預留的。
不知各位DBA兄弟有沒看出這個表與它的幾個從表的關係,有點不太“講道理”,
居然有2個一對一的關係。“爲什麼不合並?不知道第3範式啊?”,老小弟
以前想裝文化人的時候,總是這樣嚇唬小小弟的。若干年後,當老小弟看了幾本
架構/模式的書,自我掃盲之後,才知道其實這是ORM模式中的一種。
另外,微軟工程師這樣設計還是非常巧妙的。在將公有部分提成幾張基本表後,
數據庫關係圖4個部分就可合可分了。你可以試着在數據庫關係圖蓋掉某幾個部分,
剩下的部分仍然能夠成一個完整的系統。
最後再交待一下IsAnonymous和LastActivityDate兩個字段。
因爲個性化用戶配置和頁面個性化設置能夠支持匿名用戶,所以該表中也會存在匿名用戶,
IsAnonymous字段就是指示用戶是否爲匿名用戶的標誌字段。
LastActivityDate字段記錄用戶最後活動時間。該字段十分重要,每次成功的操作都會更新它,
同時它也是判斷用戶是否爲非活動用戶的依據之一。很多存儲過程都會用到它。
aspnet_WebEvent_Events表:記錄數據操作的事件日誌(可由SqlWebEventProvider啓用)。
aspnet_SchemaVersions表: