【雪野实训记录】Oracle聊天室-L1阶段项目案例

版权声明:进击的葱 https://blog.csdn.net/qlwangcong518/article/details/77053813

/*阶段项目案例
第一部分 案例描述
  案例目的
学习Oracle数据库的基本概念、建库、建表、基本增删改查,复杂查询(条件、关联、复合),,同时学习数据库对象:视图、索引的使用,还有oralce独有的两个数据库对象:序列和同义词的使用方法和场合,培养学生关于数据库的设计能力与数据的操作能力。
  案例难度
  ★★★
  案例覆盖技能点
1、  Oracle数据库基本概念
2、  建库、建表、建约束
3、  实现基本增删改查等数据的操作
1)  对数据库进行增加
2)  删除
3)  修改
4、  根据业务的需要建视图、索引、序列和同义词
1)  建视图
2)  建索引
3)  建序列
4)  建同义词
5、  高级查询技术
1)  会使用 group by、关键字
2)  会使用CASE…WHEN…THEN…
3)  会使用关联查询
4)  会使用子查询
  推荐案例完成时间
1天
第二部分  需求和开发环境
  使用技术和开发环境
Oracle10g
背景
  以前身处不同城市的朋友之间交流感情、互通信息主要通过写信,根据路程的远近一封信寄出去可能需要几天甚至十几天,朋友如果再写回信,往返一次的时间就更长了;随着科技的发展,出现了电报、电话,人与人之间的沟通变得更加迅速和高效;而伴随着计算机的普及和互联网的飞速发展,出现了MSN、QQ等各种可以即时通讯的聊天工具,还有数不清的在线聊天室,越来越多的人选择通过网上聊天来交流感情和互通信息。
案例需求
聊天系统最终要实现的功能与QQ大致相同,主要包括聊天(支持文本、语音和视频)、传送文件和远程协助等功能。在此,只实现其最基本功能——以文本形式进行聊天。*/
/*1. 注册用户管理
包括用户的注册、用户基本信息的修改(包括修改密码)、用户的删除、用户的登录验证,以及用户信息的查看和查找等。
2. 管理员管理
包括管理员的添加、修改、删除、登录验证和查询等。
3. 好友管理
包括申请添加好友、对添加好友的验证信息进行处理、删除好友(从好友列表中删除)等。
4. 聊天信息管理
包括发出聊天信息、显示聊天信息等。
*/




————————————————————————————————————————————————————————————————————————————

第一部分 项目描述

1.1项目目的

           学习Oracle数据库的基本概念、建库、建表、基本增删改查,复杂查询(条件、关联、复合),同时学习数据库对象:视图、索引的使用,还有oralce独有的两个数据库对象:序列和同义词的使用方法和场合,培养学生关于数据库的设计能力与数据的操作能力。

第二部分 需求和开发环境

2.1使用技术和开发环境

               Oracle-11g

2.2项目需求

教学质量是学校生存与发展的生命线,不断提高课堂教学水平是学校和每一位教师的共同心愿。及时了解课堂教学的主体—学生对教学情况的评价及建议,有利于教师发现自己教学中的优点以及不足,从而进一步改进教学方法,提高教学水平。为了更好的提高教学水平,建立学校与学员的更好勾通,院领导研究决定研发本系统,并提供考核内容管理、反馈项目管理、反馈表管理、数据统计分析等主要功能,本阶段案例主要以考核内容管理为主要分析目标。

2.3详细功能

考核内容管理、反馈项目管理、反馈表管理、数据统计分析等主要功能

2.4 E-R

   

2.5数据表的设计

表1 用户表

表名

t_user (用户表)

列名

描述

数据类型

空/非空

约束条件

Userid

用户编号

NUMBER(38)

非空

主键(自增)

Pwd

密码

NVARCHAR2(100)

非空

唯一

Nickname

昵称

NVARCHAR2(10)

非空

 

Sex

性别

NUMBER(1)

 

 

Birthday

出生日期

DATE

 

 

Currstate

当前状态

NUMBER(1)

 

默认值0,外键

friendshipplicy

交友策略

NUMBER(1)

 

外键

 

表2 用户状态表

表名

t_onlinestate (用户状态表)

列名

描述

数据类型

空/非空

约束条件

Stateid  

状态编号

NUMBER(1)

非空

主键

Statedesc  

状态描述

NVARCHAR2(20)

非空

唯一

 

表3 好友表

表名

 t_friend (好友表)

列名

描述

数据类型

空/非空

约束条件

Ufid

编号

NUMBER(38)

非空

主键(自增)

Userid

用户编号

NUMBER (38)

非空

外键

Friendid

好友编号

NUMBER (38)

非空

外键

表4 交友策略表

表名

t_friendshippolicy(交友策略表)

列名

描述

数据类型

空/非空

约束条件

Polid

编号

NUMBER(1)

非空

主键

Policy

交友策略

NVARCHAR2(20)

非空

唯一

表5 聊天信息表

表名

 t_message(聊天消息表)

列名

描述

数据类型

空/非空

约束条件

Messageid

编号

NUMBER(38)

非空

主键(自增)

Fromuserid

信息发出者

NUMBER(38)

非空

外键

Touserid

信息接受者

NUMBER(38)

非空

外键

Coutent

信息内容

NVARCHAR2(50)

 

 

messagetype

信息类型

NUMBER(1)

 

 

State

是否已读

NUMBER(1)

 

 

Sendtime

发出时间

DATE

 

 

表5 管理员表

表名

t_admin(管理员表)

列名

描述

数据类型

空/非空

约束条件

Admin

编号

NUMBER(10)

非空

主键(自增)

Adminname

管理员名称

NVARCHAR2(20)

非空

唯一

Adminpwb

密码

NVARCHAR2(100)

非空

 

2.6数据库约束的设计

功能:在user表中设置userid为主键

实现:  UseridNUMBER(38) primary key not null

功能:在user表中将stateIid设置为表t_onlinestate的外键

实现:Currstate NUMBER(1)default 0 references t_onlinestate(Stateid)
   

功能:在user表中将Polid设置为表t_friendshippolicy的外键

实现:friendshippolicyNUMBER(1) references t_friendshippolicy(Polid)

功能:在t_onlinestate设置stateid为主键

实现:Stateid NUMBER(1)primary key not null

 

功能: t_friendshippolicy设置Polid为主键

实现:Polid NUMBER(1)primary key not null

功能:在t_friend设置Ufid为主键

实现:Ufid NUMBER(38)primary key not null

功能:在 t_message表中设置Messageid为主键,FromuseridTouserid为外键

实现: MessageidNUMBER(38) primary key not null,--  非空  主键(自增)
    Fromuserid NUMBER(38) not null references t_user(Userid),--   
非空  外键
    Touserid NUMBER(38)  not null references t_user(Userid),--
非空  外键

 

功能:t_admin设置Adminid为主键

实现: AdminidNUMBER(10) primary key not null,--  非空  主键(自增)

2.7数据库序列的设计

功能:在user表中建立seq_user序列并设置取值范围

实现:drop sequenceseq_user;
create sequence seq_user
    increment by 1
    start with 10001
    maxvalue 999999999
    nocycle
    cache 10;

功能:在friend表中建立seq_friend序列

实现:create sequenceseq_friend; 

功能:在admin表中建立seq_admin序列

实现:create sequenceseq_admin; 

2.8数据库视图的设计

功能:查询某个好友的聊天记录
实现:drop view v_message;
create view v_message as
select fromuserid,touserid,Content1,sendtime from t_message;

select * from v_message where fromuserid = &fromuserid and touserid =&touserid;
功能:查询某个用户的所有好友。
实现:create view v_friendas
select userid,friendid from t_friend;
select * from v_friend where userid = &userid;

2.10数据库触发器的设计

功能:在插入数据之前,先给userid赋值,以免发生null错误。

实现:create or replacetrigger tir_user

      before insert on t_user for each row

      begin

  selectseq_user.nextval

          into :new.Userid from dual;

      end;

 

功能:在插入数据前,先给每一行附上序号,以免发生null错误。

实现:create or replacetrigger tir_friend

      before insert on t_friend for each row

      begin

                          select seq_friend.nextval

          into :new.Ufid from dual;

  end;

 

 

功能:在插入数据前,先给每一行附上序号,以免发生null错误。

实现:create or replacetrigger tir_messaged

      before insert on t_message for each row

      begin

      select seq_message.nextval

         into :new.Messageid from dual;

      end;

 

功能:在插入数据前,先给每一行附上序号,以免发生null错误。

实现:create or replacetrigger tir_admin

      before insert on t_admin for each row

      begin

              select seq_admin.nextval

          into :new.Adminid from dual;

              end;

2.11数据库函数的设计

功能:显示所有好友的信息

实现:

create or replace procedure all_friend_proc

is

    cursorall_friend_cur is select t_friend.userid from t_friend ;

    v_useridt_friend.userid%type;

    v_friendidt_friend.friendid%type;

    v_nicknamet_user.nickname%type;

begin

  for fd inall_friend_cur loop

    selectt_friend.userid,t_friend.friendid,t_user.nickname

    intov_userid,v_friendid,v_nickname from t_friend,t_user

    wheret_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_useridt_user.userid%type;

    v_touseridt_message.touserid%type;

    v_fromuseridt_message.fromuserid%type;

    v_contentt_message.content%type;

    cursorall_fromuserid_cur is select fromuserid from t_message ;

begin

    for fud inall_fromuserid_cur loop

        selectt_user.userid,t_message.touserid,t_message.content intov_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;

2.12数据库存储过程的设计

 

功能:将此功能设计成一个存储过程,实现大量的用户进行注册功能,实现数据的存储。

实现:create or replaceprocedure register_proc(

  pwd varchar2,

  nickname varchar2,

  sex number,

  birthday date,

  currstate number,

  friendshippolicynumber

)

is

Begin Insert

into t_uservalues(userid_seq.nextval,pwd,nickname,sex,birthday,currstate,friendshippolicy);

end;

set serveroutput on;

exec register_proc('123','qwert',1,'01-8-2017',2,3);


附录代码:

ister_proc('123','qwert',1,'01-8-2017',2,3);


--1. 用户表
create  table t_user(
--列名  描述  数据类型(精度范围)  空/非空  约束条件
    Userid NUMBER(38) primary key not null,--  非空  主键(自增),初始值10001
    Pwd NVARCHAR2(100) not null,--  非空  
    Nickname NVARCHAR2(10) not null,--  非空  
    Sex NUMBER(1)  CHECK( Sex in (0,1)),
    Birthday DATE,    
    Currstate NUMBER(1) default 0 references t_onlinestate(Stateid),--     默认值0,外键
    friendshippolicy NUMBER(1) references t_friendshippolicy(Polid)--    外键
);
insert into t_user(Pwd,Nickname,Sex,Birthday,Currstate,friendshippolicy) values
       ('123456','Cong',0,sysdate,1,1);
select * from t_user;

    
drop sequence seq_user;                    --序列
create sequence seq_user
    increment by 1
    start with 10001
    maxvalue 999999999
    nocycle
    cache 10;


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;


--2. 用户状态表
create table t_onlinestate(--(用户在线状态表)
--列名  描述  数据类型(精度范围)  空/非空  约束条件
    Stateid NUMBER(1) primary key not null,-- 非空  主键
    Statedesc NVARCHAR2(10) unique not null--  非空  唯一
);
insert into t_onlinestate values (1,'在线');
insert into t_onlinestate values (2,'离线');
insert into t_onlinestate values (3,'隐身');
insert into t_onlinestate values (4,'忙碌');
select * from t_onlinestate;
/*用户状态表里的数据如下:
编号  用户在线状态
1  在线
2  离线
3  隐身
4  忙碌
*/



--3.交友策略表
create table t_friendshippolicy(--(交友策略表)
--列名  描述  数据类型(精度范围)  空/非空  约束条件
    Polid NUMBER(1) primary key not null,--  非空  主键
    Policy NVARCHAR2(20) unique not null--  非空  唯一
);
insert into t_friendshippolicy values (1,'允许任何人加我为好友');
insert into t_friendshippolicy values (2,'不允许任何人加我为好友');
insert into t_friendshippolicy values (3,'经过验证才允许别人加我为好友');
select * from t_friendshippolicy;
/*交友策略表数据如下:
编号  交友策略
1  允许任何人加我为好友
2  不允许任何人加我为好友
3  经过验证才允许别人加我为好友
*/


--4. 好友表
create table t_friend(--(好友表)
--列名  描述  数据类型(精度范围)  空/非空  约束条件
    Ufid NUMBER(38) primary key not null,-- 非空  主键(自增)
    Userid NUMBER(38) not null references t_user(Userid),-- 非空  外键
    Friendid NUMBER(38) not null references t_user(Userid) -- 非空  外键
);


insert into t_friend(userid, friendid) values (10001,10002);
insert into t_friend(userid, friendid) values (10002,10003);
insert into t_friend(userid, friendid) values (10003,10005);
insert into t_friend(userid, friendid) values (10004,10003);
select * from t_friend;


create sequence seq_friend;


create or replace trigger tir_friend
before insert on t_friend for each row
begin
  select seq_friend.nextval
         into :new.Ufid from dual;
end;

--5. 聊天信息表
create table t_message(--(聊天消息表)
--列名  描述  数据类型(精度范围)  空/非空  约束条件
    Messageid NUMBER(38) primary key not null,--  非空  主键(自增)
    Fromuserid NUMBER(38) not null references t_user(Userid),--    非空  外键
    Touserid NUMBER(38) not null references t_user(Userid),-- 非空  外键
    Content1 VARCHAR2(50),   
    messagetype NUMBER(1) CHECK(messagetype in (0,1)),
    State NUMBER(1) default 0 CHECK(State in (0,1)),
    Sendtime DATE default sysdate--    默认值
);
insert into t_message(fromuserid,touserid,content1,messagetype) values
       (10004,10005,'XXXXXXXXXXXXXXXXXXXXXXX',0);
insert into t_message(fromuserid,touserid,content1,messagetype) values
       (10002,10005,'阿萨大神大所大所大所大所多',0);
select * from t_message;

create sequence seq_message;


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;

--6. 管理员表
create table t_admin(--(管理员表)
--列名  描述  数据类型(精度范围)  空/非空  约束条件
    Adminid NUMBER(10) primary key not null,--  非空  主键(自增)
    Adminname NVARCHAR2(20) unique not null,--  非空  唯一
    Adminpwd NVARCHAR2(100) not null--  非空  
);


insert into t_admin(adminname,adminpwd) values ('sku','111');
select * from t_admin;

create sequence seq_admin; --序列

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;

猜你喜欢

转载自blog.csdn.net/qlwangcong518/article/details/77053813
今日推荐