惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
SecWiki News
SecWiki News
Forbes - Security
Forbes - Security
N
News | PayPal Newsroom
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
V
V2EX - 技术
S
Secure Thoughts
W
WeLiveSecurity
Google DeepMind News
Google DeepMind News
C
CERT Recently Published Vulnerability Notes
NISL@THU
NISL@THU
S
Securelist
S
Security Archives - TechRepublic
Know Your Adversary
Know Your Adversary
V
Vulnerabilities – Threatpost
Security Latest
Security Latest
Recent Commits to openclaw:main
Recent Commits to openclaw:main
G
GRAHAM CLULEY
H
Hacker News: Front Page
Microsoft Azure Blog
Microsoft Azure Blog
I
Intezer
Google Online Security Blog
Google Online Security Blog
美团技术团队
阮一峰的网络日志
阮一峰的网络日志
T
The Exploit Database - CXSecurity.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Webroot Blog
Webroot Blog
Jina AI
Jina AI
Engineering at Meta
Engineering at Meta
P
Proofpoint News Feed
The Cloudflare Blog
I
InfoQ
L
LangChain Blog
U
Unit 42
P
Proofpoint News Feed
S
Schneier on Security
S
Security Affairs
Y
Y Combinator Blog
T
Tenable Blog
N
News and Events Feed by Topic
MyScale Blog
MyScale Blog
量子位
Google DeepMind News
Google DeepMind News
Cyberwarzone
Cyberwarzone
博客园 - 聂微东
D
Darknet – Hacking Tools, Hacker News & Cyber Security
GbyAI
GbyAI
AWS News Blog
AWS News Blog

博客园 - wangyan

[转]程序员需要具备的基本技能 LumaQQ.NET For Visual Studio 2005 代码下载 [转]今天你多态了吗? [转]理解C#值类型与引用类型 C#抽象工厂模式的几种实现方法及比较 在C#中使用钩子:按下Alt+F4时使窗口最小化 ASPNETDB 存储过程(4) 个性化用户配置部分 ASPNETDB 存储过程(3) 角色管理部分 ASPNETDB 存储过程(2) 成员资格管理部分 ASPNETDB 存储过程(1) 基本及杂类 ASPNETDB 表和视图(3) 个性化用户配置、页面个性化设置 表 和视图 ASPNETDB 表和视图(2) 用户成员资格和角色管理 表 更改login控件对密码安全性的要求 - wangyan 加密解密、信息摘要 Web网站开发设计中常用的技巧 统计在线用户列表 for .net WebForm ASP.NET中怎样实现在线人数的显示 ASP.NET在线用户列表精确版——解决用户意外退出在线列表无法及时更新问题 软件架构师之路
ASPNETDB 数据库关系图、表和视图(1) 基本表和独立表
wangyan · 2007-12-05 · via 博客园 - wangyan
   

揪出ASP.NET 2.0四大“插件”的总后台 --  ASPNETDB
 
    数据库关系图、表和视图(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 Diagram

   这张图还是蛮重要的,兄弟们在看后面的内容时,还是要常回来看看,回来看看。


      
     在ASPNETDB数据库的几个表中,都有名称为Lowered***的字段,
     这些字段用来存放***字符串字段的小写形式副本。
     因为这些***字符串字段的比较都是不区分大小写,在表中存放一个小写形式副本,
     能提高字符串比较的速度。
   
     基本表 aspnet_Application、aspnet_Users

  1. 应用程序表

    aspnetdb Diagram

    每个Provider都有一个ApplicationName属性,该属性一般定义在web.config中。
    举一个ProfileProvider的例子(其余3个Provider也一样):

    <system.web>
      ...
      <connectionStrings>
        <add name="SqlSrvConnectionString" connectionString="..."/>
      </connectionStrings>
      ...
      <profile defaultProvider="SqlSrvProfileProvider">
         <providers>
          <add name="SqlSrvProfileProvider"
            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值呢。
    不过在此老小弟建议各位兄弟,别没事找事,还是取一样的名称好。

  2. 基本用户表

    aspnetdb Diagram

    表中MobileAlias字段(以及用户成员资格表aspnet_MemberShip中的MobilePIN字段),
    没见在那里用到。老小弟猜想微软这样做有两种可能:一种是想以后帐户和手机绑定,
    另一种可能就是为手机上网而预留的。

    不知各位DBA兄弟有没看出这个表与它的几个从表的关系,有点不太“讲道理”,
    居然有2个一对一的关系。“为什么不合并?不知道第3范式啊?”,老小弟
    以前想装文化人的时候,总是这样吓唬小小弟的。若干年后,当老小弟看了几本
    架构/模式的书,自我扫盲之后,才知道其实这是ORM模式中的一种。

    另外,微软工程师这样设计还是非常巧妙的。在将公有部分提成几张基本表后,
    数据库关系图4个部分就可合可分了。你可以试着在数据库关系图盖掉某几个部分,
    剩下的部分仍然能够成一个完整的系统。

    最后再交待一下IsAnonymous和LastActivityDate两个字段。
    因为个性化用户配置和页面个性化设置能够支持匿名用户,所以该表中也会存在匿名用户,
    IsAnonymous字段就是指示用户是否为匿名用户的标志字段。
    LastActivityDate字段记录用户最后活动时间。该字段十分重要,每次成功的操作都会更新它,
    同时它也是判断用户是否为非活动用户的依据之一。很多存储过程都会用到它。

         在分块描述4大部分之前,先容我简单地介绍一下两个独立的表:
         aspnet_WebEvent_Events表:记录数据操作的事件日志(可由SqlWebEventProvider启用)。
         aspnet_SchemaVersions表:

aspnetdb Diagram

         把它的内容贴出来,各位一看就知道了。原来是微软为数据库中的各个部分设置的版本号。