目 录
0. 文档介绍... 4
0.1 文档目的... 4
0.2 文档范围... 4
0.3 术语与缩写解释... 4
1. 数据库环境说明... 7
2. 数据库的命名规则... 7
3. E—R图... 8
4. 逻辑设计... 9
5. 物理设计... 9
表汇总... 9
6. 数据库语句在系统中的应用... 13
6.1 区段信息的操作... 13
6.1.1 区段信息插入语句... 13
6.1.2 区段信息删除语句... 13
6.1.3 区段信息修改语句... 13
6.1.4 区段信息查询语句... 14
6.1.5 区段信息通过ID语句... 14
6.1.6 区段信息按管网ID来查询这个管网区域里的所有区段语句... 14
6.2 部门信息的操作... 14
6.2.1 部门信息插入语句... 14
6.2.2 部门信息删除语句... 14
6.2.3 部门信息修改语句... 14
6.2.4 部门信息查询语句... 14
6.2.5 部门信息通过ID语句... 14
6.2.6 部门信息组合查询语句... 15
6.3 人员信息的操作... 15
6.3.1 人员信息插入语句... 15
6.3.2 人员信息删除语句... 15
6.3.3 人员信息修改语句... 15
6.3.4 人员信息查询语句... 15
6.3.5 人员信息通过ID语句... 16
6.3.6 人员信息组合查询语句... 16
7. 安全性设计... 16
7.1 防止用户直接操作数据库的方法... 16
7.2 用户帐号密码的加密方法... 17
8. 数据库管理与维护说明... 17
9. 总结... 17
对项目的数据库设计进行总结
本文档是对自来水公司大表远程传抄、监控系统的数据库设计说明书。
术语 |
缩写解释 |
user |
用户 |
u_id |
用户名id |
u_name |
用户名称 |
u_add |
用户地址 |
u_tel |
用户联系方式 |
wc_id |
用水性质id |
pp_id |
区段id |
u_state |
水表安装状态 |
operator |
操作员信息 |
o_id |
操作员id |
o_name |
操作员登录名 |
e_id |
人员信息id |
r_id |
操作权限id |
o_pw |
初始密码 |
remarks |
备注 |
employee |
人员信息 |
e_id |
人员id |
d_id |
归属部门id |
e_name |
姓名 |
e_sex |
性别 |
e_pos |
职位 |
e_tel |
电话 |
PipleNetInfor |
管网信息 |
pn_id |
管网id |
pn_name |
管网名称 |
pn_area |
管辖区域 |
remarks |
备注 |
AreaInfor |
区段信息 |
pp_id |
区段id |
pp_name |
区段名称 |
pn_id |
管网id |
pp_area |
管辖区域 |
remarks |
备注 |
WaterChart |
用水性质 |
wc_id |
用水性质id |
wc_name |
用水性质名称 |
remarks |
备注 |
WaterMeterSide |
水表口径 |
wmr_id |
水表口径id |
wmr_name |
水表口径名称 |
wmr |
水表口径 |
remarks |
备注 |
WaterMeterType |
水表基本类型 |
wmt_id |
水表基本类型id |
wmt |
水表类型 |
wmt_name |
水表名称 |
wmr_id |
水表口径id |
remarks |
备注 |
deparment |
部门信息 |
d_id |
部门id |
d_name |
部门名称 |
d_add |
位置 |
d_person |
负责人 |
d_tel |
部门电话 |
WaterEquInfor |
水表设备信息 |
wm_id |
水表设备id |
wm_sim |
水表设备安装的sim卡号 |
wm_setno |
设备序列号 |
ui_d |
用户id |
wmt_id |
水表类型id |
wm_hf |
上限流量 |
wm_lf |
下限流量 |
wm_pro |
使用协议 |
wm_bn |
水表基数 |
wc_id |
用水性质id |
wm_mn |
水表最大示数 |
remarks |
备注 |
WarnInfor |
报警信息 |
wn_id |
报警id |
wm_id |
水表id |
Equip_num |
设备编号 |
Yes_num |
最日用水量 |
Month_num |
本月用水量 |
Lm_num |
上月用水量 |
Mk_num |
表同步数 |
Mc_num |
电子计数 |
Warm_type |
报警类型 |
St_add |
安装地址 |
Up_time |
最后上传时间 |
WaterMeterRecord |
水表上传记录 |
wm_id |
水表id |
date |
记录日期 |
tn |
节点n |
SystemRight |
系统权限表 |
r_id |
权限类型id |
r_type |
权限类型名称 |
操作系统:Windows XP
数据库系统:MySQL Server 5.5
设计工具: ERWin
数据库的表名及字段名用英文命名,由于字段名称太长,对于个别字段的名称采用单词的首字母组合,对于不是很长的字段名称,则取第一个单词的首字母加其它单词,并用下划线连接来组合成字段名称,对于个别较长的单词,也采用了缩写的形式,以大致提示字段意思。
FORMATS: |
TABULAR |
HIERARCHICAL |
Entity |
Name |
Type |
Definition |
Attribute |
|
AreaInfor |
Independent |
区段信息 |
||
DeparmentInfor |
Independent |
部门信息 |
||
EmployeeInfor |
Independent |
人员信息 |
||
OperatorInfor |
Independent |
操作员信息 |
||
PipleNetInfor |
Independent |
管网信息 |
||
SystemRight |
Independent |
系统权限表 |
||
UserInfor |
Independent |
用户信息 |
||
WarnInfor |
Independent |
报警信息 |
||
WaterChart |
Independent |
用水性质 |
||
WaterEquInfor |
Independent |
水表设备信息 |
||
WaterMeterRecord |
Dependent |
水表上传记录 |
||
WaterMeterSide |
Independent |
水表口径 |
||
WaterMeterType |
Independent |
水表类型 |
||
Attribute(s) of "AreaInfor" Entity |
Name |
Datatype |
Definition |
Required |
Is PK |
Is FK |
pp_id |
INTEGER |
区段ID |
Yes |
Yes |
No |
pp_name |
VARCHAR(50) |
区段名称 |
Yes |
No |
No |
pn_id |
INTEGER |
管网ID |
Yes |
No |
Yes |
pp_area |
VARCHAR(50) |
管辖区域 |
Yes |
No |
No |
remarks |
VARCHAR(50) |
备注 |
Yes |
No |
No |
Attribute(s) of "DeparmentInfor" Entity |
Name |
Datatype |
Definition |
Required |
Is PK |
Is FK |
d_id |
INTEGER |
部门ID |
Yes |
Yes |
No |
d_name |
VARCHAR(20) |
部门名称 |
Yes |
No |
No |
d_add |
VARCHAR(50) |
位置 |
Yes |
No |
No |
d_person |
VARCHAR(20) |
负责人 |
Yes |
No |
No |
d_tel |
VARCHAR(20) |
电话 |
Yes |
No |
No |
Attribute(s) of "EmployeeInfor" Entity |
Name |
Datatype |
Definition |
Required |
Is PK |
Is FK |
e_id |
INTEGER |
人员ID |
Yes |
Yes |
No |
d_id |
INTEGER |
部门ID |
Yes |
No |
Yes |
e_name |
VARCHAR(50) |
人员姓名 |
Yes |
No |
No |
e_sex |
CHAR(2) |
人员性别 |
Yes |
No |
No |
e_pos |
VARCHAR(50) |
人员职位 |
Yes |
No |
No |
e_tel |
VARCHAR(20) |
人员电话 |
Yes |
No |
No |
Attribute(s) of "OperatorInfor" Entity |
Name |
Datatype |
Definition |
Required |
Is PK |
Is FK |
o_id |
INTEGER |
操作员ID |
Yes |
Yes |
No |
o_name |
VARCHAR(20) |
操作员登录名 |
Yes |
No |
No |
e_id |
INTEGER |
人员ID |
Yes |
No |
Yes |
r_id |
INTEGER |
操作权限 |
Yes |
No |
Yes |
o_pw |
VARCHAR(50) |
密码 |
Yes |
No |
No |
remarks |
VARCHAR(100) |
备注 |
Yes |
No |
No |
Attribute(s) of "PipleNetInfor" Entity |
Name |
Datatype |
Definition |
Required |
Is PK |
Is FK |
pn_id |
INTEGER |
管网ID |
Yes |
Yes |
No |
pn_name |
VARCHAR(20) |
管网名称 |
Yes |
No |
No |
pn_area |
VARCHAR(50) |
管辖区域 |
Yes |
No |
No |
remarks |
VARCHAR(100) |
备注 |
Yes |
No |
No |
Attribute(s) of "SystemRight" Entity |
Name |
Datatype |
Definition |
Required |
Is PK |
Is FK |
r_id |
INTEGER |
|
Yes |
Yes |
No |
r_type |
VARCHAR(20) |
|
Yes |
No |
No |
Attribute(s) of "UserInfor" Entity |
Name |
Datatype |
Definition |
Required |
Is PK |
Is FK |
u_id |
INTEGER |
用户ID |
Yes |
Yes |
No |
u_name |
VARCHAR(20) |
用户名称 |
Yes |
No |
No |
u_add |
VARCHAR(50) |
地址 |
Yes |
No |
No |
u_tel |
VARCHAR(20) |
联系方式 |
Yes |
No |
No |
pp_id |
INTEGER |
区段ID |
Yes |
No |
Yes |
u_state |
CHAR(6) |
水表安装状态 |
Yes |
No |
No |
wc_id |
INTEGER |
用水性质ID |
Yes |
No |
Yes |
wmt_id |
INTEGER |
水表类型ID |
Yes |
No |
Yes |
Attribute(s) of "WarnInfor" Entity |
Name |
Datatype |
Definition |
Required |
Is PK |
Is FK |
|
CHAR(18) |
|
Yes |
No |
No |
wn_id |
INTEGER |
报警ID |
Yes |
Yes |
No |
wm_id |
INTEGER |
水表ID |
No |
No |
Yes |
equip_num |
FLOAT |
设备编号 |
Yes |
No |
No |
yes_num |
FLOAT |
昨日用水量 |
Yes |
No |
No |
month_num |
FLOAT |
本月用水量 |
Yes |
No |
No |
lm_num |
FLOAT |
上个月用水量 |
Yes |
No |
No |
mk_num |
FLOAT |
表同步数 |
Yes |
No |
No |
mc_num |
FLOAT |
电子计数 |
Yes |
No |
No |
warm_type |
VARCHAR(50) |
报警类型 |
Yes |
No |
No |
st_add |
VARCHAR(50) |
安装地址 |
Yes |
No |
No |
up_time |
VARCHAR(50) |
最后上传时间 |
Yes |
No |
No |
Attribute(s) of "WaterChart" Entity |
Name |
Datatype |
Definition |
Required |
Is PK |
Is FK |
wc_id |
INTEGER |
用水性质ID |
Yes |
Yes |
No |
wc_name |
VARCHAR(20) |
用水性质名称 |
Yes |
No |
No |
remarks |
VARCHAR(100) |
备注 |
Yes |
No |
No |
Attribute(s) of "WaterEquInfor" Entity |
Name |
Datatype |
Definition |
Required |
Is PK |
Is FK |
wm_id |
INTEGER |
水表ID |
Yes |
Yes |
No |
wm_sim |
VARCHAR(50) |
SIM卡号 |
Yes |
No |
No |
wm_setno |
VARCHAR(50) |
设备序列号 |
Yes |
No |
No |
u_id |
INTEGER |
用户ID |
Yes |
No |
Yes |
wmt_id |
INTEGER |
水表类型ID |
Yes |
No |
Yes |
wm_lf |
FLOAT |
下限流量 |
Yes |
No |
No |
wm_hf |
FLOAT |
上限流量 |
Yes |
No |
No |
wm_pro |
VARCHAR(50) |
使用协议 |
Yes |
No |
No |
wm_bn |
FLOAT |
水表基数 |
Yes |
No |
No |
wm_mn |
FLOAT |
最大示数 |
Yes |
No |
No |
remarks |
VARCHAR(100) |
备注 |
Yes |
No |
No |
Attribute(s) of "WaterMeterRecord" Entity |
Name |
Datatype |
Definition |
Required |
Is PK |
Is FK |
wm_id |
INTEGER |
水表ID |
Yes |
Yes |
Yes |
date |
DATE |
记录日期 |
Yes |
Yes |
No |
t1 |
FLOAT |
时间节点1:6:00-6:15 |
No |
No |
No |
tn |
FLOAT |
时间节点n: |
No |
No |
No |
Attribute(s) of "WaterMeterSide" Entity |
Name |
Datatype |
Definition |
Required |
Is PK |
Is FK |
wmr_id |
INTEGER |
水表口径ID |
Yes |
Yes |
No |
wmr_name |
VARCHAR(20) |
水表口径名称 |
Yes |
No |
No |
wmr |
INTEGER |
水表口径 |
Yes |
No |
No |
remarks |
VARCHAR(100) |
备注 |
Yes |
No |
No |
Attribute(s) of "WaterMeterType" Entity |
Name |
Datatype |
Definition |
Required |
Is PK |
Is FK |
wmt_id |
INTEGER |
水表类型ID |
Yes |
Yes |
No |
wmt |
VARCHAR(20) |
水表类型 |
Yes |
No |
No |
wm_name |
VARCHAR(20) |
水表名称 |
Yes |
No |
No |
wmr_id |
INTEGER |
水表口径ID |
Yes |
No |
Yes |
remarks |
VARCHAR(100) |
备注 |
Yes |
No |
No |
|
String sql = "insert intoareainfor(pp_id,pp_name,pn_id,pp_area,remarks) values(?,?,?,?,?)";
String sql = "DELETE FROM areainforWHERE pp_id=?" ;
String sql = "UPDATE areainfor SETpp_name=?,pn_id =?,pp_area=?,remarks=? WHERE pp_id=?";
String sql = "SELECTpp_id,pp_name,pn_id,pp_area,remarks FROM areainfor";
String sql = "SELECTpp_id,pp_name,pn_id,pp_area,remarks FROM areainfor WHERE pp_id=?";
String sql = "SELECTpp_id,pp_name,pn_id,pp_area,remarks FROM areainfor WHERE pn_id=?";
String sql = "INSERT INTOdeparmentinfor (d_id,d_name,d_add,d_person,d_tel) VALUES(?,?,?,?,?)" ;
String sql = "DELETE FROMdeparmentinfor WHERE d_id=?";
String sql = "UPDATE deparmentinforSET d_name=?,d_add=?,d_person=?,d_tel=? WHERE d_id=?";
String sql = "SELECTd_id,d_name,d_add,d_person,d_tel FROM deparmentinfor";
String sql = "SELECTd_id,d_name,d_add,d_person,d_tel FROM deparmentinfor WHERE d_id=?";
String forwhere = "";
String sql = "SELECTd_id,d_name,d_add,d_person,d_tel FROM deparmentinfor WHERE 1=1 " ;
if(null != dep.getD_id() && false ==dep.getD_id().toString().equals("")) {
forwhere += " andd_id=" + dep.getD_id();
}
if(null != dep.getD_name() && false ==dep.getD_name().equals("")) {
forwhere += " andd_name LIKE '%" + dep.getD_name() + "%'";
}
if(null != dep.getD_add() && false ==dep.getD_add().equals("")) {
forwhere += " and d_addLIKE '%" + dep.getD_add() + "%'";
}
if(null != dep.getD_person() && false ==dep.getD_person().equals("")) {
forwhere += " andd_person LIKE '%" + dep.getD_person() + "%'";
}
if(null != dep.getD_tel() && false ==dep.getD_tel().equals("")) {
forwhere += " and d_telLIKE '%" + dep.getD_tel() + "%'";
}
sql += forwhere;
String sql = "INSERT INTOemployeesinfor(e_id,e_name,e_sex,e_pos,e_tel,d_id) VALUES(?,?,?,?,?,?)";
String sql = "DELETE FROMemployeesinfor WHERE e_id=?" ;
String sql = "UPDATE employeesinforSET e_name=?,e_sex=?,e_pos=?,e_tel=?,d_id=? WHERE e_id=?";
String sql = "SELECTe_id,e_name,e_sex,e_pos,e_tel,d_id FROM employeesinfor”;
String sql = "SELECTe_id,e_name,e_sex,e_pos,e_tel,d_id FROM employeesinfor WHERE e_id=?";
String forwhere = "";
String sql = "SELECTe_id,e_name,e_sex,e_pos,e_tel,d_id FROM employeesinfor WHERE 1=1" ;
if(null != emp.getE_id() && false ==emp.getE_id().toString().equals("")) {
forwhere += " ande_id=" + emp.getE_id();
}
if(null != emp.getE_name() && false ==emp.getE_name().equals("")) {
forwhere += " ande_name LIKE '%" + emp.getE_name() + "%'";
}
if(null != emp.getE_sex() && false ==emp.getE_sex().equals("")) {
forwhere += " ande_sex LIKE '%" + emp.getE_sex() + "%'";
}
if(null != emp.getE_pos() && false ==emp.getE_pos().equals("")) {
forwhere += " ande_pos LIKE '%" + emp.getE_pos() + "%'";
}
if(null != emp.getE_tel() && false ==emp.getE_tel().equals("")) {
forwhere += " ande_tel LIKE '%" + emp.getE_tel() + "%'";
}
if(null != emp.getD_id() && false == emp.getD_id().toString().equals("")){
forwhere += " andd_id=" + emp.getD_id();
}
sql += forwhere;
对用户进行级别设定,用户分为以下几个级别,经理,操作人员,稽查人员,业务人员,不同的用户给予不同的权限,防止部分用户对数据库进行不必要的操作而引起不必要的麻烦。
采用密码保护的形式,每个用户都可以给自己设置密码保护,如设置提示问题,修改密码的时候必须经过回答问题,答对问题才可以进行密码修改,这样子可以防止别人知道自己的密码而进行更改使本用户无法登录系统。
每天都有新的记录必须写入数据库,这就要求有专门的操作人员来负责对数据库信息的增添操作,经过一段时间,部分信息可能需要更新,比如说用户的联系方式换了,或者用户因为某种原因不再用水等,这些都要及时更新到库里面,这些也都需要操作人员来完成。对于管理层,可以对下属用户进行操作,重新赋予权限。关于数据库的维护,通过实时备份数据库,当数据库出现异常的时候,将备份好的数据重新导入数据库,以防止重大损失.
本次实验由于布置时间比较早,所以有足够的时间来开发比较大型的系统。个人觉得如果系统太小实在无法体现出数据库系统这门课的精髓所在,各个表之间的关联,主键,联合主键等等以及数据库设计是否符合范式的要求。
此次实验最大的收获就是对数据库加深了认识。懂得了如何规范化设计数据库,怎样编写高效查询,如果分析、设计、构造、实现数据库模型。而且让我对J2SE加深认识。