宝玉

专注于web开发技术
随笔 - 114, 评论 - 1519 , 引用 - 583

《Asp.Net Forums2.0深入分析》之数据库分析

数据库,作为一个论坛的核心部分,有必要首先重点分析一下,Asp.Net Forums2.0的数据库是设计的非常棒的,从中我们也可以学到不少东西,大家可以在安装目录下的docs目录内找到Data Model.vsd,表结构和表间关系一目了然。如图:

Asp.Net Forums2.0 数据库结构图

大家可以看到Asp.Net Forums2.0的表命名基本都是以“forums_”开头,这样很容易和其他系统的表分辨开来。

其中一些数据量大的表分离成多个,例如:将帖子的相关信息和用户资料都变成了两个表:保存帖子信息的表forums_Posts,从中单独提取出来了(forums_Threads表),用来专门保存主题相关信息;还有用户信息也由两个表来保存forums_Users和forums_UserProfile,这样 可以适当提高了检索效率

在字段设置方面:一般枚举变量所在字段都是用的smallint,布尔值用bit,只有三种情况的枚举用tinyint,基本都是ntext,nvarchar,很少用varchar

注意forums_UserProfile表中有一个字段:StringNameValues(varbinary 7500),因为用户资料表不像其他表,字段变化比较大,例如我们需要在原来基础上想加上用户的QQ信息,如果按照常规方法,那么我们需要增加一个字段,而现在利用StringNameValues(varbinary 7500)字段,我们可以把所有符合以下条件的属性全部放到这个字段中,这样不管我们需要给用户资料增加什么属性,都不需要去更改表结构:
1. 不需要用来被检索和作为检索条件的信息
2. 不需要直接在数据库中看到的信息
3. 内容不太大的信息

具体实现的方法在后面会有详细的叙述!

接下来将对每个表和字段的作用作一个详细的说明:

表名:[forums_Users]
描述:保存所有用户信息
字段名 描述
UserID 用户ID,唯一标志一条用户纪录
UserName 用户名
Password 密码
PasswordFormat 密码加密方式
Salt 盐,一串随机数,辅助加密用
PasswordQuestion 密码问题
PasswordAnswer 密码答案
Email 真实信箱地址,用来接收密码及论坛相关邮件,不对外公开
DateCreated 注册日期
LastLogin 最后一次登陆时间
LastActivity 最后一次活动时间——有别于LastLogin,因为有的用户选择了记住密码,所以不需要登陆
LastAction 最后一次动作是什么,例如:发表帖子、浏览帖子、查看某人资料
UserAccountStatus 当前用户状态,例如:帐号未审核,帐号被禁用
IsAnonymous 是否匿名帐户,因为有的板块可以设置为匿名用户可以发帖,所以有一个帐号专门用作匿名帐号。
ForceLogin 是否禁止登陆,管理员可以设置不让某个用户登录。
AppUserToken  

(时间关系,这部分内容慢慢完善,预计一天几个表,一两个星期就都完了)

发表于 2004年4月21日 15:11

评论

# re: 《Asp.Net Forums2.0深入分析》之数据库分析

StringNameValues(varbinary 7500)字段的确是个很神秘的字段,
搞不清楚他内部的数据结构是怎样的。也不知如何写入和读取。

Asp.Net Forums2.0的代码真是很难懂,可能因为我很菜。
1、AspNetForums.Controls.ForumGroupView中:
string skinFilename = "View-ForumGroupView.ascx";
定义了skinFilename,但不知他从哪里写了代码套用到网页中?

2、在Components和Controls项目中没引用AspNetForums.SqlDataProvider.dll组件,如何调用mssql数据库,但事实上可以调用,到底是从哪里调用的呢?

3、我觉得弄懂首页中<Forums:ForumGroupView runat="server" />语句就可解决一大半的问题。
就是说这条语句依次调用了哪些函数和组件,把整个过程线索搞明白,其它问题就容易理解了。建议先写这部分。(就算出了正式版,其原理也是一样的)

总之太多的继承,引用,不了解结构的话很难懂,项目的结构很重要,希望能讲一讲。谢谢!
2004-4-23 11:53 | goo3721

# re: 《Asp.Net Forums2.0深入分析》之数据库分析

1. 大多数控件都是从SkinnedForumWebControl这个基类继承的,这个类里面有一个Page.LoadControl(skinPath)方法,具体你可以看代码
2.实际上Controls的所有数据库的操作都是调用Components里面的方法,而Components里面对数据库的访问是通过访问抽象类ForumsDataProvider里面的方法,实际上,真正实现数据库操作的是在SqlDataProvider,在这个里面SqlDataProvider继承了ForumsDataProvider类,并且重写了里面的抽象方法。
3.ForumGroupView是一个自定义控件

下一步就把结构详细讲一下,下周我好好整理一下,这个是整个程序的精华部分
2004-4-23 12:31 | 宝玉

# re: 《Asp.Net Forums2.0深入分析》之数据库分析

我觉得应该从default.aspx写起。
主要是:<Forums:ForumGroupView runat="server" />语句。
我现在所知道的:
1、调用AspNetForums.Controls.ForumGroupView()函数。
2、继承SkinnedForumWebControl。
[ParseChildren(true)] //确定将服务器控件的子XML元素当作该控件的属性分析。

接着:
ForumContext forumContext = ForumContext.Current;//建立ForumContext对象(调用ForumContext.Current,未完...)
string skinFilename = null;
string skinName = null;
string returnURL = null;
ForumMode mode = ForumMode.User;(未完...)
构造函数(确定用户Skin)
public SkinnedForumWebControl() {
if (forumContext.User.IsAnonymous) {
skinName = Globals.Skin;
} else {
skinName = forumContext.User.Theme;
}
}

3、初始化:
ForumContext forumContext = ForumContext.Current;
ForumMode mode = ForumMode.User;
string skinFilename = "View-ForumGroupView.ascx";
Repeater repeater;

赋值SkinFilename
public ForumGroupView() {
if (SkinFilename == null)
SkinFilename = skinFilename;
}
未完.......

太复杂了,望高手继续完善。
2004-4-23 12:36 | goo3721

# re: 《Asp.Net Forums2.0深入分析》之数据库分析

我没找到那个VSD呀
2004-5-2 1:09 | wyuch

# re: 《Asp.Net Forums2.0深入分析》之数据库分析

你这数据库模的大图,是如何抓取的?
2004-6-1 17:18 | Dili

# re: 《Asp.Net Forums2.0深入分析》之数据库分析

这是他文档里面的:)
2004-6-1 17:19 | 宝玉

# re: 《Asp.Net Forums2.0深入分析》之数据库分析

原来你在线,可以加MSN吗?我的MSN是:dili@wellknow.net
2004-6-1 17:33 | Dili

# re: 《Asp.Net Forums2.0深入分析》之数据库分析

请问宝玉,您有对其他的数据库表像user一样这样分析的文章吗?
2004-6-3 21:30 | slvyi

# re: 《Asp.Net Forums2.0深入分析》之数据库分析

很抱歉没有补全,如果您对哪个表有疑问的可以直接问我:)
2004-6-4 8:25 | 宝玉

# re: 《Asp.Net Forums2.0深入分析》之数据库分析

Good ! thank the author.
2007-9-7 1:21 | 窃听器

Post Comment

主题  
姓名  
主页
校验码  
内容   
京ICP备 05050892号