首页 数据库 mysql教程 帮助你开发基于MySQL数据库的论坛设计_MySQL

帮助你开发基于MySQL数据库的论坛设计_MySQL

Jun 01, 2016 pm 02:03 PM
char int 基于 帮助 开发 数据库 文章 论坛 设计

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

热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 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

首发899元 中兴5G随身Wi-Fi U50S开售:最高网速500Mbps 首发899元 中兴5G随身Wi-Fi U50S开售:最高网速500Mbps Apr 26, 2024 pm 03:46 PM

4月26日消息,中兴5G随身Wi-FiU50S目前已经正式开售,首发899元。外观设计上,中兴U50S随身Wi-Fi简约时尚,易于手持和包装。其尺寸为159/73/18mm,携带方便,让您随时随地畅享5G高速网络,实现畅行无阻的移动办公与娱乐体验。中兴5G随身Wi-FiU50S该设备支持先进的Wi-Fi6协议,峰值速率高达1800Mbps,依托骁龙X55高性能5G平台,为用户提供极速的网络体验。不仅支持5G双模SA+NSA网络环境和Sub-6GHz频段,实测网速更可达惊人的500Mbps,轻松满

荣耀Magic V3首发AI离焦护眼技术:有效缓解近视发展 荣耀Magic V3首发AI离焦护眼技术:有效缓解近视发展 Jul 18, 2024 am 09:27 AM

7月12日消息,荣耀MagicV3系列今日正式发布,搭载全新荣耀视力舒缓绿洲护眼屏,在屏幕本身具备高规格和高素质的同时,还开创性的引入AI主动式护眼技术。据悉,传统的缓解近视的方式是“近视镜”,近视眼镜度数均匀分布,保证了视线中心区域成像在视网膜之上,但周边区域成像在视网膜后,视网膜感应到成像在后,促进眼轴向后生长,从而使度数加深。目前主要的缓解近视发展的方式之一是“离焦镜”,其中心区域度数正常,周边区域通过光学设计分区调整,从而使周边区域成像落在视网膜前,

1399元起 荣耀X60i手机开售:视觉四等边OLED直屏 1399元起 荣耀X60i手机开售:视觉四等边OLED直屏 Jul 29, 2024 pm 08:25 PM

7月29日消息,荣耀X60i手机今日正式开售,首发1399元。设计上,荣耀X60i手机采用居中挖孔直屏设计,四边近乎无界的超窄边框,极大地拓宽了视野边界。荣耀X60i参数显示屏:6.7英寸高清显示屏电池:5000mAh大容量电池处理器:天玑6080处理器(台积电6nm,2x2.4G的A76+6×2G的A55)系统:MagicOS8.0系统其他功能:5G信号增强灵动胶囊屏下指纹双MIC降噪知识问答摄影能力:后置双摄系统:5000万像素主摄200万像素辅助镜头前置自拍镜头:800万像素价格:8GB

iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 Jul 18, 2024 am 05:48 AM

苹果公司最新发布的iOS18、iPadOS18以及macOSSequoia系统为Photos应用增添了一项重要功能,旨在帮助用户轻松恢复因各种原因丢失或损坏的照片和视频。这项新功能在Photos应用的"工具"部分引入了一个名为"已恢复"的相册,当用户设备中存在未纳入其照片库的图片或视频时,该相册将自动显示。"已恢复"相册的出现为因数据库损坏、相机应用未正确保存至照片库或第三方应用管理照片库时照片和视频丢失提供了解决方案。用户只需简单几步

全新堆叠工艺!小米MIX Fold 4首搭金沙江'立体异形”电池 全新堆叠工艺!小米MIX Fold 4首搭金沙江'立体异形”电池 Jul 20, 2024 am 03:20 AM

7月19日消息,小米MIXFold4首旗舰折叠新机今晚正式发布,首次搭载“立体异形电池”。据介绍,小米MIXFold4在电池技术上实现了重大突破,专为折叠屏设计了创新的“立体异形电池”。传统折叠屏设备多采用常规方形电池,空间利用效率较低。为解决这一问题,小米没有采用常见的卷绕式电芯,而是全新开发叠片工艺,打造全新形态的电池,大幅提升了空间利用率。电池技术创新为了实现精确交替堆叠正负极片,确保锂离子安全嵌入,小米开发了新型超声焊接机和叠片机,提高了焊接和裁切精

2024款苹果iPad Pro/Air不支持第二代Apple Pencil:有需求可购新款 2024款苹果iPad Pro/Air不支持第二代Apple Pencil:有需求可购新款 May 08, 2024 pm 04:07 PM

5月8日消息,苹果新款iPadPro/Air平板电脑目前已经发布,根据苹果官网的消息,新款iPadPro和iPadAir均不再支持2018年发布的第二代ApplePencil,而是仅支持ApplePencilPro及ApplePencil(USB-C)。ApplePencil(USB-C)于2023年11月发布,这款手写笔在保持与第一代和第二代ApplePencil相同的像素级精准度、低延迟和倾斜角度感应等功能的同时,去除了压感功能,并且不支持无线充电。其售价为649元。而新发布的ApplePe

vivo信号最强手机!vivo X100s搭载寰宇信号放大系统:21天线、360°环绕设计 vivo信号最强手机!vivo X100s搭载寰宇信号放大系统:21天线、360°环绕设计 Jun 03, 2024 pm 08:41 PM

5月13日消息,vivoX100s今晚正式发布,除了出色的影像,新机在信号方面表现也十分强悍。据vivo官方介绍,vivoX100s采用了创新的寰宇信号放大系统,该系统配备了高达21根天线。这一设计基于直屏进行了重新优化,以平衡5G、4G、Wi-Fi、GPS以及NFC等众多信号需求。这使得vivoX100s成为了vivo有史以来信号接收能力最强的手机。新款手机还采用了独特的360°环绕设计,天线分布在机身周围。这一设计不仅增强了信号的强度,还针对日常各种握持姿势进行了优化,避免了因握持方式不当导

在PHP中使用MySQLi建立数据库连接的详尽教程 在PHP中使用MySQLi建立数据库连接的详尽教程 Jun 04, 2024 pm 01:42 PM

如何在PHP中使用MySQLi建立数据库连接:包含MySQLi扩展(require_once)创建连接函数(functionconnect_to_db)调用连接函数($conn=connect_to_db())执行查询($result=$conn->query())关闭连接($conn->close())

See all articles