校园一卡通数据库部分设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.ER模型到关系模型的转换
学生(学号,姓名,性别)
主键
卡(卡号,学号,状态,余额,发卡日期,截止日期)主键外键
设备(设备编号,地点)
主键
充值(充值服务编号,卡号,学号,充值金额,充值日期)
主键外键外键
刷卡(本次消费编号,设备编号,卡号,消费金额,消费时间)
主键外键外键
3.建表sql语句
create table 刷卡(
本次消费号number primary key,
设备编号number,
卡号number,
foreign key(设备编号) references 设备(设备编号),
foreign key(卡号) references 卡(卡号)
);
create table 学生(
学号varchar2(10)primary key,
姓名varchar2(20),
性别varchar2(5)
);
create table 充值(
充值服务编号varchar(10)primary key, 卡号number,
学号number,
充值金额number,
充值日期date,
foreign key(学号) references 卡(学号),foreign key(卡号) references 卡(卡号)
);
create table 卡(
卡号number primary key,
学号number,
状态varchar(5),
余额number,
发卡日期date,
截止日期date
);
create table 设备(
设备编号varchar2(10)primary key,
地点varchar2(20)
);
4.索引设计
1.对学生表按学号建立索引,可加快对学生用户查询:index_student
Create index index_student
on 学生(卡号);
2.对一卡通信息表的挂失字段建立索引:index_card_lost
Create index index_card_lost
on 卡(状态);
5.触发器
充值触发器
create or replace trigger cards_info
after insert on 充值
for each row
begin
UPDATE 卡SET 余额= 卡.余额+new.充值金额WHERE 充值.卡号= 卡.卡号end;
刷卡触发器
create or replace trigger cards_info
after insert on 刷卡
for each row
begin
UPDATE 卡SET 余额= 卡.余额+new.消费金额WHERE 刷卡.卡号= 卡.卡号
end;
6.各个业务功能对应的SQL语句、存储过程
发卡
create or replace procedure 发_卡
(start_card IN 卡.卡号%TYPE,end_card IN 卡.卡号%TYPE,
start_stu_number IN 学生.学号%TYPE,end_stu_number IN学生.学号%TYPE) IS j int;
begin
j:=start_stu_number;
CREATE OR REPLACE PROCEDURE 插入_卡
(start_card IN卡.卡号%TYPE,end_card IN 卡.卡号%TYPE,
start_time IN 卡.发卡时间%TYPE,end_time IN 卡.截止时间%TYPE) IS
BEGIN
FOR i IN start_card..end_card LOOP
insert into cards values(i,NULL,0,0,start_time,end_time);
END LOOP;
END;
/
if end_card-start_card=end_stu_number-start_stu_number then
for i in start_card..end_card LOOP
update 卡set 卡号=i where 学号=j;
j:=j+1;
end loop;
end if;
end;
create or replace procedure 发卡
(num1 卡.卡号%TYPE,num2 卡.卡号%TYPE,
money 卡.余额%TYPE,
start_time 卡.发卡时间%TYPE,end_time 卡.截止时间%TYPE,
start_stu_number 学生.学号%TYPE,end_stu_number 学生.学号%TYPE)IS
begin
插入_卡(num1,num2,1,start_time,end_time);
发_卡(num1,num2,start_stu_number,end_stu_number);
end;