搜索
首页数据库mysql教程帮助你开发基于MySQL数据库的论坛设计_MySQL
帮助你开发基于MySQL数据库的论坛设计_MySQLJun 01, 2016 pm 02:03 PM
charint基于帮助开发数据库文章论坛设计

1。系统架构: EA vK| `  
采用模块化思想,分为3层: q,n,B|Q  
NY7f  
  a。数据存储层:使用MySQL来存放bbs的所有数据,包括用户信息,文章数据,用户信件,用户消息,系统数据(?),关键问题: 数据库的规划,是否用文件来辅助。 ! _Q"  
CB[H 2 
  b。系统功能层:完成bbs的基本功能,由多个并列模块组成,向下调用mysql的函数访问数据库,向上,接受处理请求,将处理的结果返回上层,根据请求类型,返回成败结果和其他数据。而且模块高度灵活,可以方便的修改增加。包括: V|1Q4[Yc  
O3c"afU  
  ** 用户模块,处理用户的注册,基本数据的修改,权限的变化,网友信息的查询。 e`i K%C;)  
  ** 版面模块,完成文章发表,文章的读取,文章的删除,文章的加标记,读改删权限检查,此模块对数据库的要求最高。 VqZ .K(9  
  ** 精华区模块,包括精华区的文章,目录的增加,删除,上下移动 S ]2u|S  
!_u{|t  
'%H8 pm  
(?)读改删权限检查,目录结构是其中的难点。 n' y/':K  
-rZ%??[rC  
  ** 信件模块,包括发新信件,读删信件,信笺标记,新信件的通知 :U-k* 3e  
  ** 消息模块,包括发送消息,接受消息,新消息通知,消息回顾,消息存信件。 \i#" (w!Q  
  ** 系统动态模块,包括当前上站人数,当前动态,由于变动频繁,此类数据用共享内存实现可能更好。 j" :e#Apb  
  ** 聊天模块,双人聊天是否能借鉴icq的做法,由双方直接通话,但聊天结果存信件可能较麻烦,同时,为兼容telnet功能,当上层服务层为telnet时,增加专门的模块来进行处理。 (.?|T4  
  ** 聊天室模块,利用共享内存还是数据库?开房间,里面的权限问题。根据需要,还能增加新的功能。例如:活动看板模块,但对于非telnet终端,意义好象不大。。。。。

3。数据库设计 ]AD]O? 
O~.{XT$  
  关键还是MySQL的效率问题,合理分配mysql的内存,特别是table cache的 K!?c-1[~}(  
大小。另外,当系统突然掉电呢?mysql是否robust? 6b]~K[cp%  
  table的名字设计,采用一位前缀表明类型,全部用小写表示(?),例如: &WOC)^ Ia  
系统的数据库,以s为前导,如用户表:suser(sUSER 呢?),具体如下: }0gv0Q#  
~^s=i,O  
s :系统表,suser,sclass wJidO_Tu_  
m :用户信件表,msysop,mdrangon ia "3A)4  
w :用户消息表,wsysop,wdrangon mpx9@4pk>  
a :版面索引表,aLinux,acampus e\7*9~}?  
b :版面文章表,blinux,bcampus '{{bfIHz  
c :特殊分类版面表,cnewboard _cY&(_  
i :精华区索引表,ilinux,ilinux01,icampus,icampus04 g@jk'l  
j :精华区文章表,jlinux,jcampus, k9 O5S~^U  
(I?C5*Yu  
  另外,是使用字串还是数字作为标识呢?例如,一个叫sysop的帐号,其 g@;uj Or'  
id是1,他的信的表是msysop还是m00001呢?同样,一个叫campus的版,对应的 5oc:%{ L$  
代码是5,则这个版的文章的表名是bcampus还是b00005呢?可能用字串会容易 PSf V #3  
理解,查错吧。 lR73 R|;  
l?e.%QRW  
用户信息表:suser +>:B-hD^.A  
X ~xt[`s_  
usernum int unique, // 唯一标识符,最多30000个帐号,会不会太少了? \p>N^n-q  
userid char[20] primary key, // 排序的关键字,id,全小写。 XLd@on3?f  
passwd char[20], // 密码,存放加密后的密文。 Jr3=i  
realid char[20], // 实际id,大小写混合。 9'xg>PS  
username char[24], // 用户的泥称 7b 
userlevel longint, // 64种权限? hQrV~P9\c  
nUMLogins int, xas T3G  
numposts int, YuFmcPmT  
firstlogin time, BR?eE@3  
lastlogin time, r%3.H  
staytime time, /* 总共停留时间 */ FD#JN3L1!  
lasthost char[32], 6j%+RR  
email varchar[100], v(0TszV  
address varchar[100], sN7*a )7b  
;dw*g5L)  
// 还需要其他数据吗?是否需要留出一定的保留值,以后alter table来 XDHhobR  
// 增加新的字段时,效率如何? t#t'S?@  
d!_lxJ?w  
版面分类表:sclass {>]h*)% $  
;X 4:9J E  
classnum int unique, // 分类标识 cfDb3,!PU  
classid char[20], // 分类的英文id:computer uf8|mvac  
classname varchar[100],// 分类的中文描述:电脑世界 6} u2yx1 
classtable char[20], // 特殊分类对应的版面表 5 pz\ &  
// 一般来说,每个版面只属于一个分类,对于特殊分类,例如拳头版块, EsGx\0Y|k  
// 新版面,可以用专门的表来描述 aj Jjgs;  
版面表:sboard DY\Q[=X  
k|a[T(  
boardnum int unique, // 版面的标识(需要吗?) W0@_:CFYa  
boardid char[20], // 版面的英文名 \g.@+=cSR  
boardname varchar[100], // 版面的中文名 *i&h`  
boardclass char[20], // 版面所属分类 {n/L}w_Z  
boardsysop varchar[100], // 斑竹名单 ]y{wUf k  
boardposts int, // 版面的文章数 B22[ER  
boardlevel int, // 版面的读写权限 a3_=C!A7H  
indextable char[20], // 版面对应的索引表的名称:aboardid? RGf5g #  
texttable char[20], // 版面对应的文章表名称: bboardid? >38CZUP  
$)zW0oa  
// 最后两项有没有必要出现,是否可以作为必然对应关系,还是允许 =(&"F\r@X  
// 出现更大的灵活性?另外版面的大小写问题是否可以直接默认 QO} y_~@  
// 只开头字母大写, `AvA 34S;  
d"Xf`@B&ZZ  
特殊分类版面表:snewboard, sstarboard )\hbT[s%  
k/bqGHYb  
boardid char[20], // 版面的id )_17O93d7W  
// 这样的表有必要吗? o^}&o,+  
qT'wA*{  
版面索引表:acampus,aLinux,afootball。。。。。。 00,Viq6  
V\T7W|(  
id int, // 文章序数,要手动调整???? dMq nEP@ 
mark char[1], // 文章标记,m,g,b,d。。。。 WqZ9Dn3l  
title varchar[100], // 文章标题 @ThXa"  
writer char[20], // 文章作者id i1 +Q@pw  
posttime time, // 发表时间 .,&y>  
textnum longint, // 对应的编号???不调整 U/jc[j@  
qhPa{~  
版面文章表 $lq H  
zzaoFki[  
textnum longint, // 文章编号? c{8=MZvM\  
textword text, // 文章内容? v3*wj*Bk  
Pil=(%s  
// 有必要将索引和文章内容分开吗?从效率上看,况且lazy flush /eJ*o~U&  
// 是必然的。删除也是先做个标记。 DFqN|i_ `  
d;R.o  
// 用户中的版面文章是否未读的数据比较繁,是否应该再建一堆的表 i| O~^DVD  
// 才能实现呢? *Z',OZxB  
// 投票功能暂不考虑。。。。

4。用户模块设计 D  
 对于底层数据库,调用MySQL的C API函数来进行数据库的修改,内部保存一定的状态变量(例如用户名,还是留给上一层完成?),对上一层,则提供用户管理的接口。 ,3$]1*K- 9  
+.6"#p"PF  
Class UserManage { ~(JH>?ncMI  
private: \d.GW9FV  
char myuserid[20]; // 用户的id,未登陆前为空 JPmJ  
time logintime; // 用户登陆时间,并用于计算停留时间 Pw_ngscK  
char loginhost[20]; //上站地点。 5Ri/^;W  
FsO/'G  
public: ZnnC%9~,  
Qr^' 9 _T  
int NewUser( char *userid, char *passwd ); ^)%{=*Sx:  
新建一个用户,判断是否已经有,其他资料暂时为空, @#tdSD^`M  
firstlogintime,权限等设缺省值。 Y);DKP/  
int UserLogin( char *userid, char *passwd ); uxxyQz2 q  
用户登陆,验证密码, !isP~z  
int ChangePasswd( char *oldpasswd, char *newpasswd ); $$|cbQ,  
修改密码,要求原密码一致。 j=]Y `V>  
int ChangePriData( char *newname, char *newemail, ?8iZi$t!  
char *newaddr ); TIWNQ+t8  
改变基本数据,泥称,email,住址。。。。 d]t3sa)WSf  
int ModifyNumData( int addlogin, int addpost ); w=a~yi}Dl  
修改文章数,上站次数,等数据。。。。注意调用对象。 Yjh(~P  
int UserLogout(); $-Q"=7  
用户退出,修改lastlogin,staytime,loginhost等 y]qi\nw5\  
#l=$]aD&e  
// 普通查询命令 @yW m7  
int QueryCommonData( const char * userid, int& loginnum, XS1i 
char * username, int& postnum, 42 VZv  
time& lastlogin, char *lasthost ); 31.tCQo}TU  
查询网友基本信息。 y9%_^7 b*  
!)Rwh2Z  
// 特权指令,函数在完成功能前,先判断权限。 'K=ZtHu`C  
int QueryPriData( const char * userid, char *email, @AL|i>mV  
char *addr ); =8kY1o ]  
查询基本信息,普通人只能查自己,有特权才能查其他人。 G K=]R;Fq_  
int ModifyUserLevel( BOOL isAdd, unsigned long level ); zi \N>M 
修改用户的权限, lg7jZJA\  
int ModifyUserId( char *oldid, char *newid ); m?[~,Pg=  
char *newemail, char *newaddr ); 8 T~^\8U)  
修改用户的基本数据。 tKesJ.U  
int ModifyUserNumdata( char *userid, int addlogin, int addpost ); TjoEGoTf, 
修改用户的文章数等数据。 f=)!.u; 
int ModifyUsERPasswd( char *userid, char *newpasswd ); Xr#:@8Y;  
修改用户的密码。 "5'$Bs&=  
} mdzn! %.f6  
5Pc#4CWUP  
  以上各个函数难度不大,都是执行相应的sql语句,访问mysql数据库,是否将一般指令归到特权指令中去呢?权限的检查,是放在这一层还是上一层? yyyhM9*"YR  
  这更多的是看考虑的着重点,是看程序的清晰性还是代码的简练,可能还是看代码吧,毕竟要考虑访问量,另外,上层服务层是否也应该考虑权限检查问题呢? wvK@GL?  
5。版面模块设计 1XZyP [Ik  
| [zXh]TI  
   所谓分类,更多的是为telnet服务端考虑的,在cq66模式下,用户可以按照自己的意愿进行分类,反正最后都是直接以版为基本单位访问的。 c%8?":bQ  
  对于版面文章的访问,存放的时候以整篇文章为参数,文章的分块由本层完成,如果上层以块为单位传送,则在上层全部传完,组合后,再传参到本层分解;在读取 的时候,本层则以块为单位访问,如果上层要以全文为单位访问,则在上层做合并 工作,本层不管。 I._}jCOC1U  
  至于要不要独立出索引,不影响上层的操作,主要和下层的数据库构造有关,主要考虑可行性,效率需求等。 *z:2fk>  
  权限的检查放在哪里进行呢?还是放在上层吧,其实就telnet服务器端,和cq66 的客户端,根本不会给一般用户显示特殊指令的菜单,当然,用户可以直接发送cq66 的指令,服务器方还是要检查的。但应该不用在它下面的功能模块层再检查一次吧 。 :R6lJb:48  
tv5VSP.I  
Class BoardManage { 1f> 6sl  
private: u4P{-"~'  
R3 WIn.de  
public: R%0LmFoK  
// 有关分类的操作 c|$& -$!7  
int GetClassNameInfo( int maxclass, char **classid, R/iz#mLX  
char ** classname ); yGFZ)IIw  
返回分类的信息,中英文名。 W7|oo#9azg  
int GetBoardName( int maxboards, char *classid, _H' 3nN7G=  
char **boardname ); uF&HM +a  
返回某分类中的版面信息,一般分类,直接select .. `TY s8^D  
from sboard i/pp?epU  
where boardclass == .... 特殊分类则查相应的表。。。。 y7bj -  
>:\zTsV"  
// 修改需要版面管理员以上的特权 d\l!MOGL  
int NewClass( char * newclassname, int type ); `%[j,Z#  
新建分类,普通分类还是特殊分类, 2MNg\rbp  
int DeleteClass( char *newclassname ); lyl:a]a  
删除分类,但不cascade,即本层不负责一致性,由上层负责将 Rc 
相应的版面的分类信息改为别的。分类改名也是先删再建, 4||6=L  
int AddClassBoard( const char *classname, char *newboardname ); `/!\!*gz|N  
将已建好的版加入某分类中,专门针对特殊分类,对一般分类,其 ^aHBtr:  
效果和modifyboardinfo一样, %0' Y?%s  
int DeleteClassBoard( const char *classname, char *boardname ); UYTZw9-^O  
从分类中删除某个版,也是针对特殊分类,对一般分类,效果也 $|SWF=Q  
是和modifyboardinfo一样,一个版的分类属性可以为空,即不属 6^{n!i&q|{  
于任何分类。 4}BAXm?F  
// 有关版的信息的操作。 R( 1v  
int NewBoard( const char *boardid,char *boardname); FWvL`  
新建一个版,建立对应的表。其他参数取默认值。 2 N F)i  
int DeleteBoard( const char *boardid ); bopeof8  
删除一个版,删除对应的表。 ~2Ap?gwoax  
int GetBoardInfo( const char *boardid, char *boardname, GdPMT|^  
int& numposts, char *masters, char *class, \_0M  
long &level ); =kU9A*?  
取的版面的信息。 yGp{ "  
int ModifyBoardId( const char *oldid, char *newid ); g`_ca  
改变版的英文id,对应table的名称也要改变, 7-*gd 8Xd}  
int ModifyBoardInfo( const char *boardid, char *boardname, IJV(2#*Y  
int numposts, char *masters, char *class, #+@tDx=  
long level ); H[8nq{0 @  
修改版面信息,需要特权。 jVYv+9pk  
obX%,/  
// 有关版面文章的操作。 irGM_mh%-  
int AddText( char *boardid, char *title, char *writer, )bJ] 5f 9  
char *text ); _M WRO  
往版面中增加文章,内部将长文章分割成2k的块。 Fmi3E2N  
int DeleteText( char *boardid, int num ); B`UdWdjr0(  
删除文章,只是做一个标记,并不立刻修改对应的table。 OohU?!7;OP  
int FlushTable( char *boardid ); %|3AMv;p  
刷新版面,删除被删文章的对应的记录。 NAiOE(B  
int MarkText( char *boardid, int num, char mark ); DmA{jNn1 
给文章做标记。 o?U31}  
int ModifyTitle( char *boardid, int num, char *newtitle ); ' ;OR.L 
修改文章的标题。 zdV"8!  
int ModifyText( char *boardid, int num, char *newtext ); 78j}j!H1  
修改文章内容,不是自己的文章需要特权。 XFc&GYW|  
int GetTextInfo( const char *boardid, int num, char *title, DR8xyAy_  
char *writer, char& mark ); 0` RcHOk  
取得文章的标题信息。 +P7]T(L:k  
int GetText( const char *boardid, int num, int block, qCI;k{Eq  
char *text ); D" (* }K  
读取文章的内容,以块为单位。 Vtr>w f]yn  
hpy e6AA  
// 文章和作者的查询 61"\x% I  
// 一次将查询的结果全部返回? A1"~vh  
int QueryWriter( const char *boardid, char *writer,

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
discuz论坛是什么discuz论坛是什么Jul 10, 2023 am 11:03 AM

discuz论坛是一种网络论坛软件,也称BBS,它是一种用于在互联网上建立论坛社区的程序系统。只哟中功能强大的论坛软件,可以帮助用户建立一个专业、完善的论坛社区,并且可以实现多种功能,如搭建用户注册、登录、查看主题、发布帖子、发表评论、设置版主等功能,让用户可以轻松地进行论坛社区的管理和维护。

Discuz论坛权限管理:阅读权限设置指南Discuz论坛权限管理:阅读权限设置指南Mar 10, 2024 pm 05:33 PM

Discuz论坛权限管理:阅读权限设置指南在Discuz论坛管理中,权限设置是至关重要的一环。其中,阅读权限的设置尤为重要,它决定了不同用户在论坛中能够看到的内容范围。本文将详细介绍Discuz论坛的阅读权限设置,以及如何针对不同的需求进行灵活的配置。一、阅读权限基础概念在Discuz论坛中,阅读权限主要有以下几个概念需要了解:默认阅读权限:新用户注册后默认

Go语言中的面向服务架构设计Go语言中的面向服务架构设计Jun 04, 2023 am 09:51 AM

随着互联网技术的不断发展,面向服务架构(SOA)的理念越来越受到人们的重视。在这个背景下,Go语言作为一种高效、可靠的编程语言,也逐渐成为了很多企业与开发者实现SOA的首选语言。本文将深入探讨Go语言中的面向服务架构设计。一、SOA简介面向服务架构是一种软件设计的架构风格,它将复杂的系统拆分成多个相互独立、可复用的服务,每个服务都有独立的功能实现,并使用标准

Java API 开发中的 RESTful 接口设计Java API 开发中的 RESTful 接口设计Jun 18, 2023 am 08:31 AM

随着互联网技术的发展,RESTful风格的API设计成为了最为流行的一种设计方式。而Java作为一种主要的编程语言,也越来越多地在RESTful接口的开发中扮演着重要的角色。在JavaAPI开发中,如何设计出优秀的RESTful接口,成为了一个需要我们深入思考的问题。RESTful接口的基本原则首先,我们需要了解RESTful接口的基本原则。REST即Re

Discuz 论坛热帖设置指南Discuz 论坛热帖设置指南Mar 10, 2024 am 11:45 AM

Discuz论坛热帖设置指南随着网络的迅速发展,论坛作为一个重要的网络社区平台,扮演着连接用户、分享信息和交流观点的重要角色。在Discuz论坛中,热帖是吸引用户并提高论坛活跃度的重要方式之一。通过设置热帖,管理员可以将优质内容置顶展示,激发用户参与讨论,增加帖子的曝光度和点击率。本文将介绍如何在Discuz论坛中设置热帖功能,同时提供具体的代码示

php论坛有哪些php论坛有哪些Jul 25, 2023 am 11:12 AM

php论坛有:1、PHP论坛,PHP官方网站的论坛板块,是PHP开发者之间交流的重要平台;2、phphub,国内知名的PHP技术社区,也是中国最大的PHP技术论坛之一;3、Laracasts,一个面向Laravel框架的在线学习平台;4、Reddit PHP,一个全球知名的社交新闻聚合网站;5、SitePoint,一个提供从网页设计到开发的综合性技术社区。

自动驾驶汽车的软件升级技术管理与监管策略分析自动驾驶汽车的软件升级技术管理与监管策略分析May 16, 2023 am 08:40 AM

随着智能车辆在网联化、智能化及架构技术的发展,汽车无论是在固件还是软件上都已经不可逆转的需要进行软件迭代升级。要求在汽车生命周期内会不断的基于汽车OTA能力为整车提供软件升级、固件升级、售后服务等服务能力,可以说,汽车的智能化更迭对于OTA升级能力已经成为不可或缺的主流趋势。本文章将针对自动驾驶汽车的软件升级现状需求及监管要求等进行详细的描述。意在帮助读者整体了解自动驾驶中的软件升级过程原理、准入要求及其应对策略。1整车软件升级技术优势首先,软件定义汽车推动了整车软件升级技术的发展与应用,通过整

前后端分离、社交论坛、问答、发帖/BBS项目,多端功能完整前后端分离、社交论坛、问答、发帖/BBS项目,多端功能完整Jul 25, 2023 pm 05:39 PM

林风社交论坛小程序|H5论坛|app论坛是java+vue+uniapp开发的前后端分离社交论坛问答发帖/BBS项目,包括论坛图文帖,视频,圈子,IM私聊,微信支付,付费贴,积分签到,钱包充值等论坛小程序论坛app完整功能。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器