聊天室项目
数据库设计说明书
目录
第一部分 项目描述
1.1项目目的
以前身处不同城市的朋友之间交流感情、互通信息主要通过写信,根据路程的远近一封信寄出去可能需要几天甚至十几天,朋友如果再写回信,往返一次的时间就更长了;随着科技的发展,出现了电报、电话,人与人之间的沟通变得更加迅速和高效;而伴随着计算机的普及和互联网的飞速发展,出现了MSN、QQ等各种可以即时通讯的聊天工具,还有数不清的在线聊天室,越来越多的人选择通过网上聊天来交流感情和互通信息。
第二部分 需求和开发环境
2.1使用技术和开发环境
Oracle11g
2.2项目需求
聊天系统最终要实现的功能与QQ大致相同,主要包括聊天(支持文本、语音和视频)、传送文件和远程协助等功能。在此,只实现其最基本功能——以文本形式进行聊天。
2.3详细功能
1. 注册用户管理
包括用户的注册、用户基本信息的修改(包括修改密码)、用户的删除、用户的登录验证,以及用户信息的查看和查找等。
2. 管理员管理
包括管理员的添加、修改、删除、登录验证和查询等。
3. 好友管理
包括申请添加好友、对添加好友的验证信息进行处理、删除好友(从好友列表中删除)等。
4. 聊天信息管理
包括发出聊天信息、显示聊天信息等。
2.4 E-R图
2.5数据表的设计
1)
|
表名 |
t_user (用户表) |
|||
|
列名 |
描述 |
数据类型 |
空/非空 |
约束条件 |
|
Userid |
用户编号 |
Number(40) |
非空 |
主键(自增),初始值10001 |
|
Pwd |
密码 |
VARCHAR2(40) |
非空 |
|
|
Nickname |
昵称 |
VARCHAR2(20) |
非空 |
|
|
Sex |
性别 |
NUMBER(1) |
|
0或1 |
|
Birthday |
出生日期 |
DATE |
|
|
|
Currstate |
当前状态 |
NUMBER(1) |
|
默认值0,外键 |
|
Policy |
交友策略 |
NUMBER(1) |
|
外键 |
|
表名 |
t_onlinestate(用户在线状态表) |
|||
|
列名 |
描述 |
数据类型 |
空/非空 |
约束条件 |
|
Stateid |
状态编号 |
Number(1) |
非空 |
主键 |
|
Statedesc |
状态描述 |
VARCHAR2(10) |
非空 |
唯一 |
|
表名 |
t_friendshippolicy(交友策略表) |
|||
|
列名 |
描述 |
数据类型 |
空/非空 |
约束条件 |
|
Polid |
编号 |
Number(1) |
非空 |
主键 |
|
Policy |
交友策略 |
VARCHAR2(20) |
非空 |
唯一 |
|
表名 |
t_friend(好友表) |
|||
|
列名 |
描述 |
数据类型 |
空/非空 |
约束条件 |
|
Ufid |
编号 |
Number(10) |
非空 |
主键(自增) |
|
Userid |
用户编号 |
Number(20) |
非空 |
外键 |
|
Friendid |
好友编号 |
NUMBER(20) |
非空 |
外键 |
|
表名 |
t_message(聊天消息表) |
|||
|
列名 |
描述 |
数据类型 |
空/非空 |
约束条件 |
|
Messageid |
编号 |
Number(20) |
非空 |
主键(自增) |
|
Fromid |
信息发出者 |
Number(20) |
非空 |
外键 |
|
Toid |
信息接收者 |
NUMBER(20) |
非空 |
外键 |
|
Content |
信息内容 |
VARCHAR2(255) |
|
|
|
State |
是否已读 |
NUMBER(1) |
默认值 |
State in (0,1) |
|
Sendtime |
发出时间 |
DATE |
默认值 |
|
2.6数据库约束的设计
功能:用户密码长度大于5
实现:5<LENGTH(PWD)
功能功能:性别只能为0或1
实现: CHECK( Sex in (0,1)),
功能:Userid 外键参考t_user表的Userid字段
实现: Userid NUMBER(20) not null references t_user(Userid)
功能:Friendid 外键参考t_user表的Userid字段
实现: Friendid NUMBER(20) not null references t_user(Userid)
功能:Fromuserid 外键参考t_user表的Userid字段
实现: Fromuserid NUMBER(20) not null references t_user(Userid)
功能:Touserid 外键参考 t_user表的Userid字段
实现: Touserid NUMBER(20) not null references t_user(Userid)
功能:时间为系统默认时间
实现: Sendtime DATE default sysdate
功能:消息读取的状态是0或1
实现:STATE BETWEEN 0 AND 1
2.7数据库序列的设计
功能:T_USER表的自增序列,从10001开始,最大9999999,每次增长为1,不循环
实现:create sequence seq_user --自增序列
increment by 1
start with 10001
maxvalue 999999999
nocycle
cache 10;
功能:T_FRIEND表的自增序列,标准从1开始,每次增长为1
实现:create sequence seq_friend;
功能:T_FRIEND表的自增序列,标准从1开始,每次增长为1
实现:create sequence seq_friend;
功能:T_MESSAGE表的自增序列,标准从1开始,每次增长为1
实现:create sequence seq_message;
功能:T_ADMIN表的自增序列,标准从1开始,每次增长为1
实现:create sequence seq_admin; ;
2.9数据库视图的设计
功能:创建关于T_MESSAGE属性的视图,用于查询某个好友的聊天记录
实现:create view v_message as
select fromid,toid,Content,sendtime from t_message;
功能:创建关于T_FRIEDN属性的视图:查询某个用户的所有好友。
实现:create view v_friend as
select userid,friendid from t_friend;
功能:描述3
实现:代码3
…………..
2.11数据库触发器的设计
功能:当数据插入到T_USER表中的时候,调用序列自增USERID
实现:create or replace trigger tir_user
before insert on t_user for each row
begin
select seq_user.nextval
into :new.Userid from dual;
end;
功能:当数据插入到T_FRIEND表中的时候,调用序列SEQ_FRIEND自增TFID
实现:create or replace trigger tir_fri 当数据插入到表中的时候,调用序列
before insert on T_FRIEND for each row
begin
select seq_friend.nextval
into :new.tfid from dual;
end;
功能:当数据插入到T_MESSAGE表中的时候,调用序列SEQ_MESSAGE自增MESSAGEID
实现:create or replace trigger tir_messaged
before insert on t_message for each row
begin
select seq_message.nextval
into :new.MESSAGEID from dual;
end;
功能:当数据插入到T_ADMIN表中的时候,调用序列SEQ_ADMIN自增ADMINID
实现:create or replace trigger tir_admin
before insert on t_admin for each row
begin
select seq_admin.nextval
into :new.Adminid from dual;
end;
2.13数据库存储过程的设计
功能:将用户提供的一些基本信息输入到用户表的过程
实现:create or replace procedure register_proc(
pwd varchar2,
nickname varchar2,
sex number,
birthday date,
currstate number,
friendshippolicy number
)
is
begin
insert into t_user values(seq_user.nextval,pwd,nickname,sex,birthday,currstate,friendshippolicy);
end;
功能:查询每个用户的所有好友
实现:create or replace procedure all_friend_proc
is
cursor all_friend_cur is select t_friend.userid from t_friend ;
v_userid t_friend.userid%type;
v_friendid t_friend.friendid%type;
v_nickname t_user.nickname%type;
begin
for fd in all_friend_cur loop
select t_friend.userid,t_friend.friendid,t_user.nickname
into v_userid,v_friendid,v_nickname from t_friend,t_user
where t_friend.userid = t_user.userid and t_friend.userid = fd.userid;
dbms_output.put_line(v_userid||' '||v_friendid||' '||v_nickname);
end loop;
end;
功能:查询每个用户和不同好友的所有聊天记录
实现:create or replace procedure message_proc
is
v_userid t_user.userid%type;
v_touserid t_message.touserid%type;
v_fromuserid t_message.fromuserid%type;
v_content t_message.content%type;
cursor all_fromuserid_cur is select fromuserid from t_message ;
begin
for fud in all_fromuserid_cur loop
select t_user.userid,t_message.touserid,t_message.content into v_userid,v_touserid,v_content from t_message,t_user where t_user.userid = t_message.fromuserid and fromuserid=fud.fromuserid;
dbms_output.put_line(v_userid||' '||v_touserid||' '||v_fromuserid||' '||' '||v_content);
end loop;
end;
第三部分 项目总结
这是第一次在基地接触有关数据库的项目,跟以往在学校的学习有所不同的是,基地的强度可能更高,同时也是全身心的投入到项目的实践当中来,其中之前学习的只是略微显得有些零零散散,项目可以将这些知识更好的融合在一起,更加的具有企业的体系。
我们开始这个项目的第一步就是建立完整思维的E-R图,将表建立好,将属性创建好,将约束条件和检查约束添加上,将外键添加上,第一次使用数据库中的模型工具,多少还是有很多的不足和不熟练的存在,希望下次做项目的时候可以有更大的进步。
将E-R图创建好之后就相当于完成了很重要的一部分,剩下的应该就是数据库的查询。首先创建了两个视图用来查询某个好友的聊天记录和查询某个用户的所有好友。接下来,又用了几个存储过程来实现存储。当然了,在数据库的查询时候,有了方方面面的问题,当然是过程触发器这种编译错误的问题,他的报错往往并不会给你明确的答复,只会告诉你有错,然后你就需要慢慢的一点一点的去找哪里的错误,比如说:书写错误,格式错误,哪里的用法不规范了等等一些列的问题,都是猝不及防的。
所以,还是需要对自己常见的数据库有一个详细的了解,对数据库属性的命名也要规范,不然自己也不知道自己写的是什么,还有对用法有足够的使用了解,这应该是第一次项目所学到的经验。