一、数据场景 1、表结构简介 任何工具类的东西都是为了解决某个场景下的问题,比如Redis缓存系统热点数据,ClickHouse解决海量数据的实时分析,MySQL关系型数据库存储结构化数据。数据的存储则需要设计对应的表结构,清楚的表结构,有助于快速开发业务,和理解系统。表结构的设计通常从下面几个方面考虑:业务场景、设计规范、表结构、字段属性、数据管理。
2、用户场景
例如存储用户基础信息数据,通常都会下面几个相关表结构:用户信息表、单点登录表、状态管理表、支付账户表等。
用户信息表
存储用户三要素相关信息:姓名,手机号,身份z,登录密码,邮箱等。
CREATE TABLE `ms_user_center` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', `user_name` varchar(20) NOT NULL COMMENT '用户名', `real_name` varchar(20) DEFAULT NULL COMMENT '真实姓名', `pass_word` varchar(32) NOT NULL COMMENT '密码', `phone` varchar(20) NOT NULL COMMENT '手机号', `email` varchar(32) DEFAULT NULL COMMENT '邮箱', `head_url` varchar(100) DEFAULT NULL COMMENT '用户头像URL', `card_id` varchar(32) DEFAULT NULL COMMENT '身份z号', `user_sex` int(1) DEFAULT '1' COMMENT '用户性别:0-女,1-男', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'; 单点登录表
用意是在多个业务系统中,用户登录一次就可以访问所有相互信任的业务子系统,是聚合业务平台常用的解决方案。
CREATE TABLE `ms_user_sso` ( `user_id` int(11) NOT NULL COMMENT '用户ID', `sso_id` varchar(32) NOT NULL COMMENT '单点信息编号ID', `sso_code` varchar(32) NOT NULL COMMENT '单点登录码,唯一核心标识', `log_ip` varchar(32) DEFAULT NULL COMMENT '登录IP地址', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户单点登录表'; 状态管理表
系统用户在使用时候可能出现多个状态,例如账户冻结、密码锁定等,把状态聚合到一起,可以更加方便的管理和验证。
CREATE TABLE `ms_user_status` ( `user_id` int(11) NOT NULL COMMENT '用户ID', `account_status` int(1) DEFAULT '1' COMMENT '账户状态:0-冻结,1-未冻结', `real_name_status` int(1) DEFAULT '0' COMMENT '实名认证状态:0-未实名,1-已实名', `pay_pass_status` int(1) DEFAULT '0' COMMENT '支付密码是否设置:0-未设置,1-设置', `wallet_pass_status` int(1) DEFAULT '0' COMMENT '钱包密码是否设置:0-未设置,1-设置', `wallet_status` int(1) DEFAULT '1' COMMENT '钱包是否冻结:0-冻结,1-未冻结', `email_status` int(1) DEFAULT '0' COMMENT '邮箱状态:0-未激活,1-激活', `message_status` int(1) DEFAULT '1' COMMENT '短信提醒开启:0-未开启,1-开启', `letter_status` int(1) DEFAULT '1' COMMENT '站内信提醒开启:0-未开启,1-开启', `emailmsg_status` int(1) DEFAULT '0' COMMENT '邮件提醒开启:0-未开启,1-开启', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户状态表'; 支付账户表
用户交易的核心表,存储用户相关的账户资金信息。
CREATE TABLE `ms_user_wallet` ( `wallet_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '钱包ID', `user_id` int(11) NOT NULL COMMENT '用户ID', `wallet_pwd` varchar(32) DEFAULT NULL COMMENT '钱包密码', `total_account` decimal(20,2) DEFAULT '000' COMMENT '账户总额', `usable_money` decimal(20,2) DEFAULT '000' COMMENT '可用余额', `freeze_money` decimal(20,2) DEFAULT '000' COMMENT '冻结金额', `freeze_time` datetime DEFAULT NULL COMMENT '冻结时间', `thaw_time` datetime DEFAULT NULL COMMENT '解冻时间', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用', PRIMARY KEY (`wallet_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户钱包'; 二、设计规范 1、涉及模块
通过上面几个表设计的案例,可以看到表设计关联到数据库的各个方面知识:数据类型,索引,编码,存储引擎等。表设计是一个很大的命题,不过也遵循一个基本规范:三范式。
2、三范式 基础概念
一范式
表的列的具有原子性,不可再分解,即列的信息,不能分解,关系型数据库MySQL、Oracle等自动的满足。
二范式
每个事实的数据记录只会出现一次, 不会冗余, 通常设计一个主键来实现。
三范式
要求一个表中不包含已经存在于其它表的非主键信息,例如部门和员工的信息,员工表包含部门表的主键ID,则可以关联获取相关信息,没必要在员工表保存相关信息。
优缺点对比
范式化设计
范式化结构设计通常更新快,因为冗余数据较少,表结构轻巧,也更好的写入内存中。但是查询起来涉及到关联,代价非常高,非常损耗查询性能。
反范式化设计
所有的数据都在一张表中,避免关联查询,索引的有效性更高,但是数据的冗余性极高。
建议结论
上述的两种设计方式在实际开发中都是不存在的,在实际开发中都是混合使用。比如汇总统计,缓存数据,都会基于反范式化的设计。
三、字段属性
合适的字段类型对于高性能来说非常重要,基本原则如下:简单的类型占用资源更少;在可以正确存储数据的情况下,选最小的数据类型。
1、数据类型选择 整数类型
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,根据数据类型范围合理选择即可。
实数类型
FLOAT、DOUBLE、DECIMAL,建议资金货币相关类型使用高精度DECIMAL存储,或者把数据成倍扩大为整数,采用BIGINT存储,不过处理相对麻烦。
字符类型
CHAR、VARCHAR,长度不确定建议采用VARCHAR存储,不过VARCHAR类型需要额外开销记录字符串长度。CHAR适合存储短字符,或者定长字符串,例如MD5的加密结构。
时间类型
DATETIME、TIMESTAMP,DATETIME保存大范围的值,精度秒。TIMESTAMP以时间戳的格式,范围相对较小,效率也相对较高,所以通常情况建议使用。
MySQL的字段类型有很多种,可以根据数据特性选择合适的,这里只描述常见的几种类型。
2、基础用法 *** 作 数据类型
修改字段类型
ALTER TABLE ms_user_sso MODIFY state CHAR(1) DEFAULT '0' ; ALTER TABLE ms_user_sso MODIFY state INT(1) DEFAULT '1' COMMENT '状态:0不可用,1可用';
修改名称位置
ALTER TABLE ms_user_sso CHANGE log_ip login_ip VARCHAR(32) AFTER update_time ; 索引使用
索引类型:主键索引,普通索引,唯一索引,组合索引,全文索引。这里演示普通索引的 *** 作。MySQL的核心模块,后续详说。
添加索引
ALTER TABLE ms_user_wallet ADD INDEX user_id_index(user_id) ; CREATE INDEX state_index ON ms_user_wallet(state) ;
查看索引
SHOW INDEX FROM ms_user_wallet;
删除索引
DROP INDEX state_index ON ms_user_wallet ;
修改索引
不具有真正意义上的修改,可以把原有的索引删除之后,再次添加索引。
外键关联
用处:外键关联的作用保证多个数据表的数据一致性和完整性,建表时先有主表,后有从表;删除数据表,需要先删从表,再删主表。复杂场景不建议使用,实际开发中用的也不多。
添加外键
ALTER TABLE ms_user_wallet ADD CONSTRAINT user_id_out_key FOREIGN KEY(user_id) REFERENCES ms_user_center(id) ;
删除外键
ALTER TABLE ms_user_wallet DROP FOREIGN KEY user_id_out_key ; 四、表结构管理 1、查看结构 DESC ms_user_status ; SHOW CREATE TABLE ms_user_status ; 2、字段结构 添加字段 ALTER TABLE ms_user_status ADD `delete_time` datetime DEFAULT NULL COMMENT '删除时间' ; 删除字段 ALTER TABLE ms_user_status DROP COLUMN delete_time ; 3、修改表名 ALTER TABLE ms_user_center RENAME ms_user_info ; 4、存储引擎 存储引擎 SELECT VERSION() ; SHOW ENGINES ;
MySQL 56 支持的存储引擎有InnoDB、MyISAM、Memory、Archive、CSV、BLACKHOLE等。一般默认使用InnoDB,支持事务管理。该模块MySQL核心,后续详解。
修改引擎
数据量大的场景下,存储引擎修改是一个难度极大的 *** 作,容易会导致表的特性变动,引起各种后续反应,后续会详说。
ALTER TABLE ms_user_sso ENGINE = MyISAM ; 5、修改编码
表字符集默认使用utf8,通用,无乱码风险,汉字3字节,英文1字节,utf8mb4是utf8的超集,有存储4字节例如表情符号时使用。
查看编码 SHOW VARIABLES LIKE 'character%'; 修改编码 ALTER TABLE ms_user_sso DEFAULT CHARACTER SET utf8mb4; 五、数据管理 1、增删改查
添加数据
INSERT INTO ms_user_sso ( user_id,sso_id,sso_code,create_time,update_time,login_ip,state ) VALUES ( '1','SSO7637267','SSO78631273612', '2019-12-24 11:56:57','2019-12-24 11:57:01','127001','1' );
更新数据
UPDATE ms_user_sso SET user_id = '1',sso_id = 'SSO20191224',sso_code = 'SSO20191224', create_time = '2019-11-24 11:56:57',update_time = '2019-11-24 11:57:01', login_ip = '127001',state = '1' WHERE user_id = '1';
查询数据
一般情况下都是禁止使用 select *** 作。
SELECT user_id,sso_id,sso_code,create_time,update_time,login_ip,state FROM ms_user_sso WHERE user_id = '1';
删除数据
DELETE FROM ms_user_sso WHERE user_id = '2' ;
不带where条件,就是删除全部数据。原则上不允许该 *** 作,优化篇会详解。TRUNCATE TABLE也是清空表数据,但是占用的资源相对较少。
2、数据安全 不可逆加密
这类加密算法,多用来做数据验证 *** 作,比如常见的密码验证。
SELECT MD5('cicada')='94454b1241ad2cfbd0c44efda1b6b6ba' ; SELECT SHA('cicada')='0501746a2e4fd34e1d14015fc4d58309585edc7d'; SELECT PASSWORD('smile')='B4FB95D86DCFC3F33A3852714DC742C77504479D' ; 可逆加密
安全性要求高的系统,需要做三级等保,对数据的安全性极高,数据在存储时必须加密入库,取出时候需要解密,这些就需要可逆加密。
SELECT DECODE(ENCODE('123456','key_salt'),'key_salt') ; SELECT AES_DECRYPT(AES_ENCRYPT('cicada','salt123'),'salt123');
上述数据安全的管理,也可以基于应用系统的服务(代码)层进行处理,相对专业的流程是从数据生成源头处理,规避数据传递过程泄露,造成不必要的风险。
所谓“数据库实例”,实际上就是数据库服务器引擎。每个SQL Server数据库引擎实例各有一套不为其他实例共享的系统及用户数据库。
在一台计算机上,可以安装多个SQL SERVER,每个SQL SERVER就可以理解为是一个实例。
有两种类型的 SQL Server 实例:
1)默认实例:默认实例仅由运行该实例的计算机的名称唯一标识,它没有单独的实例名。如果应用程序在请求连接 SQL Server 时只指定了计算机名,则 SQL Server 客户端组件将尝试连接这台计算机上的数据库引擎默认实例。
2)命名实例:除默认实例外,所有数据库引擎实例都由安装该实例的过程中指定的实例名标识。应用程序必须提供准备连接的计算机的名称和命名实例的实例名。
计算机名和实例名以格式computer_name\instance_name指定。 一台计算机上可以运行多个命名实例。
一、课程设计的内容
本课程设计要采用本课程中学习的数据库设计方法,运用其基本思路与主要图表工具完成“企业报刊订阅管理系统”数据库应用系统。完成信息需求分析与数据库的概念设计、逻辑设计、物理设计以及处理功能设计,用SQL Sever的数据库管理系统、JSP开发工具实现该系统,并运行、评价、改进之;在此基础上严格按课程设计教学大纲所附报告提纲撰写课程设计报告。通过本课程设计进一步弄懂数据库系统及其相关的基本概念,理解数据库系统的系统结构、主要特点,掌握数据库设计的原理、方法及其基本过程,初步具备数据库应用设计的能力,初步形成运用数据库应用系统解决管理决策中的实际问题的基本素质。
二、课程设计的要求与数据
要求学生结合所学管理知识,在借鉴课堂教学案例、了解家人或亲友所从事的业务及其流程的基础上,参考有关资料,选择自己了解的一项业务,运用课堂所学数据库系统与数据库设计知识,完成信息需求分析、数据库概念设计、逻辑设计、物理设计,实现完成该业务的数据库应用系统,并运行、评价改进之,最后要写出课程设计报告。
三、课程设计应完成的工作
要求学生按照《数据库应用课程设计》教学大纲完成一个数据库应用系统,并撰写相应的课程设计报告,主要内容包括:
概述:系统的基本任务,主要业务,开发目标
1 需求分析
2 (数据库)概念(模型)设计
3 (数据库)逻辑(模型)设计
4 数据库物理设计与数据库保护设计
5 处理功能设计
6 数据库应用系统的实现
7 数据库应用系统运行
四、课程设计进程安排
序号 设计各阶段内容 地点 起止日期
五、应收集的资料及主要参考文献
[1] 王 珊、陈 虹编著,数据库系统原理教程,清华大学出版社,2003
[1] 金银秋主编,数据库原理与设计,科学出版社,2000
[2] 李建中 王珊,数据库系统原理,电子工业出版社,1998
[3] 李大友,数据库原理及应用(第二版),清华大学出版社,2000
发出任务书日期: 年 月 日 指导教师签名:
计划完成日期: 年 月 日 基层教学单位责任人签章:
主管院长签章:
目录
概述 …………………………………………………………………4
1 需求分析…………………………………………………………4
11用户需求……………………………………………………………………4
12业务流程分析………………………………………………………………4
13信息需求分析………………………………………………………………5
14功能需求分析………………………………………………………………6
2 (数据库)概念(模型)设计…………………………………7
3 (数据库)逻辑(模型)设计…………………………………9
31 一般逻辑模型设计…………………………………………………………9
32 具体逻辑模型设计…………………………………………………………9
4 数据库物理设计与数据库保护设计…………………………10
41设计索引……………………………………………………………………10
42 设计表间关系………………………………………………………………10
43完整性设计…………………………………………………………………10
5 处理功能设计…………………………………………………11
6 数据库应用系统的实现………………………………………11
7 数据库应用系统运行…………………………………………11
71 写出系统 *** 作使用的简要说明……………………………………………11
72 系统实施过程………………………………………………………………11
73系统使用结果………………………………………………………………22
74系统评价……………………………………………………………………31
企业报刊订阅管理系统
概述
随着社会不断的发展,人们的生活水平越来越高,对知识的和对时事的渴求也越来越高,人们希望能够方便快捷地订阅各种报刊杂志。但是各种各样的报刊名目和详细信息以及订阅,为相关企业的管理造成很大的麻烦。因此网上订阅成为不可或缺的一部分。
本系统就是面向一个企业的报刊订阅管理系统。此系统是一种比较智能化的管理系统,它面向所有企业部门的职工用户,但具有比较高的安全性能。它能够实现报刊订阅的基本功能,包括新报刊信息的录入、订阅、查询等 *** 作以及后台数据库的备份和恢复。用户合法注册后必须输入有效密码才能成功进入此系统,可以进行订阅报刊,查询信息,统计信息等 *** 作。对于非法 *** 作,系统有识别和防护措施。
1 需求分析
11 用户需求:
本系统就是面向一个企业的报刊订阅管理系统。此系统是一种比较智能化的管理系统,它面向所有企业部门的职工用户,但具有比较高的安全性能。它能够实现报刊订阅的基本功能,包括新报刊信息的录入、订阅、查询等 *** 作以及后台数据库的备份和恢复。用户合法注册后必须输入有效密码才能成功进入此系统,可以进行订阅报刊,查询信息,统计信息等 *** 作。对于非法 *** 作,系统有识别和防护措施。
订阅信息处理的特点是订阅信息处理量比较大,所管理的信息信息种类繁多,而且订阅单、编辑单的发生量特别大,关联信息多,查询和统计的方式各不相同。因此在管理上实现起来有一定因难。
本系统在设计过程中,为了克服这些困难,需要使程序代码标准化,软件统一化,确保软件的可维护性和实用性;删除不必要的管理冗余,实现管理规范化、科学化;界面友好、简单化,做到实用、方便,尽量满足报刊订阅中员工的需要。
12 业务流程分析:
本系统主要面向的用户有系统管理员、读者。下面分角色对该系统的不同 *** 作范围做说明。
本系统主要有以下功能模块:
(1)登陆功能:登陆系统为身份验证登录。分为管理员登录和一般用户登录。分别通过不同的用户名和密码进入报刊订阅管理界面,新的用户需要注册。
(2)录入新信息功能:对于管理员,包括新用户信息和新报刊信息的录入功能,信息一旦提交就存入到后台数据库中;普通用户自行注册进行可以修改个人信息。
(3)订阅功能:用户可以订阅报刊,系统自动计算所需金额,并显示在界面上;管理员不可订阅报刊,必须以用户身份订阅报刊。
(4)查询功能:用户可以查询并显示自己所订阅的信息;管理员可以按人员、报刊、部门分类查询。查询出的信息显示在界面上,并且可以预览和打印出结果。
(5)统计功能:管理员可以按用户、部门、报刊统计报刊的销售情况,并对一些重要的订阅信息进行统计;普通用户可以统计出自己的订阅情况,并且可以预览和打印出结果。
(6)系统维护功能:数据的安全管理,主要是依靠管理员对数据库里的信息进行备份和恢复,数据库备份后,如果出了什么意外可以恢复数据库到当时备份的状态,这提高了系统和数据的安全性,有利于系统的维护。
下图为该系统的业务流程图
13 信息需求分析
131 资料收集:业务流程中用到的相关单据主要是报刊信息还有订单信息
报刊信息表:
报刊代号 46-250 报刊名称 IT时代周刊
出版报社 科技出版社
出版周期 半月刊
每月定价 1000 元/月
分类编号 1001
报刊介绍 《IT时代周刊》是一本深刻解读信息时代商业变革的杂志。除深度报道信息产业的重大新闻外,还报道金融、汽车、股市、零售等传统行业利用IT提升商业与管理的新闻。《IT时代周刊》以调查见深度;以商业故事见功力。是CEO/CIO/CFO以及政府官员、商业领袖首选刊物。
订单信息表:
订单编号 报刊代号 用户编号 订阅日期 订阅月数 份数 *** 作
3003 46-205 3206 2008-7-1 订一月 1 取消订阅
3004 26-306 3108 2008-7-8 订半年 2 取消订阅
3005 72-310 3100 2008-7-9 订一年 1 取消订阅
3006 45-214 2541 2008-7-10 订一季 1 取消订阅
132 事项分析:根据以上资料中标题、表头等中各栏目名,可以得出相关事项,作为数据项;分析这些数据项,找出组合项、导出项、非结构化数据项,确定基本项。检查是否有要补充的基本数据项,是否有要改进的地方,补充改进之,得出所有基本项。
14 功能需求分析:
本系统的主要结构功能图如下:
2 (数据库)概念(模型)设计
基本项构思ERD的四条基本原则:
①原则1 (确定实体):能独立存在的事物,例如人、物、事、地、团体、机构、活动、事项等等,在其有多个由基本项描述的特性需要关注时,就应把它作为实体。
②原则2 (确定联系):两个或多个实体间的关联与结合,如主管,从属,组成,占有,作用,配合,协同等等,当需要予以关注时,应作为联系。实体间的联系可分为一对一、一对多、多对多等三类,在确定联系时还要确定其类型。
③原则3 (确定属性):实体的属性是实体的本质特征。实体应有标识属性(能把不同个体区分开来的属性组),并指定其中一个作为主标识。联系的属性是联系的结果或状态。
④原则4(一事一地):信息分析中得到的基本项要在且仅在实体联系图中的一个地方作为属性出现。
经过上述系统功能分析和需求总结,设计如下面所示的数据项和数据结构。
管理员表(Adminuser):用于存放管理员的数据记录,包括数据项:管理员名、密码。
部门表(Department):用来存放部门的相关记录,包括数据项:部门号,部门名。
用户表(Users):用于存放注册用户的记录,包括数据项:用户账号、密码、真实姓名、身份z号、联系电话,联系地址,部门号(和部门表有关)等。
报刊类别表(NewspaperClass):用于存放初始的报刊类别记录,包括数据项:分类编号、分类名称。
报刊信息表(Newspaper):用于存放报刊记录,包括数据项:报刊代号、报刊名称、出版报社、出版周期、季度报价、内容介绍、分类编号(和报刊类别表有关)等。
订单表(Order):用于存放用户下达的订阅报刊的基本信息,包括数据项:订单编号、用户编号(用户表的主码)、报刊代号(报刊信息表的主码)、订阅份数、订阅月数等。
根据上面的设计规划出来的实体有部门实体、管理员实体、用户实体、报刊类别实体、报刊信息实体和订单实体。
部门实体的E-R图如下图所示: 管理员实体的E-R图如下图所示:
用户实体的E-R图如下图所示: 报刊信息实体的E-R图如下图所示:
订单实体的E-R图如下图所示: 报刊类别实体的E-R图如下图所示:
所有实体之间的的关系E-R图如下图所示:
3 (数据库)逻辑(模型)设计
31 一般逻辑模型设计:
关系模型的逻辑结构是一组关系模式的集合。将E-R图转换为关系模型就是要将实体型、实体的属性和实体型之间的联系转换为关系模式。
由ERD导出一般关系模型的四条原则;
①一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。如果软换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,每个实体的码均是该关系的候选码。如果与某一端实体对应的关系模式何明,则需要在该关系模式的属性中加入另一个关系模式的码和联系本身的属性。
②一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码。
③一个m:n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,各实体的码组成关系的码或关系码的一部分。
④3个或3个以上实体间的一个多元联系可以转换为一个关系模式。与该多元联系项链呢的各实体的码以及联系本身的属性均转换为关系的属性,各实体的码组成关系的码或关系码的一部分。
根据以上原则将E-R图转换成的关系模式如下:
部门(部门号,部门名称)
用户(用户账号,密码,用户真实姓名,联系电话,联系地址,部门号)
管理员(管理员名,密码)
报刊类别(分类编号,分类名称)
报刊(报刊代号,报刊名称,出版报社,出版周期,每月订价,内容介绍,分类编号)
订单(用户编号,报刊代号,订阅份数,订阅月数,订阅总额)
32 具体逻辑模型设计:
在SQL Server2000数据库中,首先创建newspaper数据库,然后根据数据库的逻辑结构分析创建表4-1━4-6的6张数据表。在前台访问数据库阶段设置了用户和密码,用户为sa,密码为空。
表4-2 department部门表结构
字段名称 字段类型 允许空 说明
depNumber(主码) Char(10) 否 部门号
depName Char(50) 是 部门名称
表4-3 users用户表结构
字段名称 字段类型 允许空 说明
userNo(主码) Char(10) 否 用户帐号
userName Char(20) 是 真实姓名
passWord Char(10) 否 用户密码
address Char(150) 是 用户联系地址
phone Char(20) 是 用户联系电话
depNumber Char(10) 否 用户所属部门号
表4-3 newspaperClass报刊分类表结构
字段名称 字段类型 允许空 说明
classid(主码) Int(4) 否 报刊分类编号
className Char(30) 是 报刊分类名称
表4-4 newspaper报刊表结构
字段名称 字段类型 允许空 说明
newsNo(主码) Char(10) 否 报刊代号
newsName Char(40) 否 报刊名称
classid Int(4) 否 报刊分类编号
publish Char(150) 是 出版报社
pubPeriod Char(30) 是 出版周期
content Char(4000) 是 内容介绍
price Float(8) 否 每月报价
表-6 book订单表结构
字段名称 字段类型 允许空 说明
userNo(主码) Char(10) 否 用户帐号
newsNo(主码) Char(10) 否 报刊代号
orderAmount Int(4) 否 订阅份数
orderMonth Int(4) 否 订阅月数
totalPrice Float(8) 是 订阅总额
表4-1 adminuser管理员表结构
字段名称 字段类型 允许空 说明
adminUser(主码) Char(20) 否 管理员用户名
adminPass Char(10) 否 管理员密码
4 数据库物理设计与数据库保护设计
41设计索引:我们可以在最经常查询的列上建立索引以提高查询效率。
而在这个系统中,我们经常要按用户账号,按报刊代号,按部门查询,所以,我们可以为这三个表建立索引,建立所以的SQL语句如下,这几个都是字符型
Create unique index userNum on users(userNo)
Create unique index departNum on department(depNumber)
Create unique index newsNum on newspaper(newsNO)
42 设计表间关系:
43完整性设计列出主要字段完整性的字段名、完整性约束条件;列出记录完整性约束及其约束条件;列出参照完整性表。
主要字段的完整性字段名和参照完整性表可以参照上图各个表之间的关系来看。
比如建立报刊表newspaper时,要求报刊代号在100~99999之间,报刊名称和每月定价不能取空值,报刊类别是报刊类别表的主键,则
Create table user
(userNo char(10) constraint C1 check(newsNo between 100 and 99999),
newsName char(40) constraint C2 not null,
classid int(4) constraint C3 not null,
publish char(150),pubPeriod char(30),content char(4000),
price float(8) not null,
constraint C4 foreign key(classid) references newspaperclass(classid) )
44在有多个用户 *** 作时,考虑用户授权与安全性控制。
因为这个报刊订阅系统由多个用户使用,分为管理员和用户,他们拥有不同的权限和安全性控制。所以在权限设置方面,采用管理员和用户分别使用用户名和密码进入他们能使用权限范围里的界面。管理员登陆系统后,可以添加、修改用户和报刊的信息,可以对订单进行查询和统计,并且可以把查询统计的结果进行预览和打印出来,还要对数据库系统进行维护,适时备份数据库,一旦数据库遇到问题,可以恢复到最近备份的状态,减少不必要的损失。
用户登录,用户使用该系统前需要进行注册,他应该是该企业某个部门下面的员工,所以他需要输入他的部门号等信息,注册成功后,登录到系统,可以修改自己的信息还有订阅报刊,但由于权限的限制,他只能查看和统计自己的订单信息。
5 处理功能设计
51 主控模块设计:
使用本系统,首先它会自动d出“欢迎使用本系统”的欢迎界面,然后跳转到用户身份验证界面,选择管理员的身份进入,有录入(录入报刊信息、录入用户信息),查询,统计(统计用户、统计、报刊订单),系统维护(备份数据库、恢复数据库),注销,退出等菜单可使用,没注册的用户可进入注册界面进行注册,然后返回登录界面登录,进入后有欢迎界面,有订阅、查询、统计、修改、注销、退出等菜单可使用。
6 数据库应用系统的实现
61 数据库及其表结构的建立:按照上面的逻辑分析见表
62数据输入:在建好的各个表中输入数据,要符合数据的约束条件
7 数据库应用系统运行
71 写出系统 *** 作使用的简要说明
本系统的运行需要安装PowerBuilder90和SQL Server2000软件。 *** 作该系统,首先把备份的数据库还原出来,导入SQL Server中,然后打开该系统,连接上还原出来的数据库,再运行,就可以了。
72 系统实施过程
(1)打开PowerBuilder,新建一个工作区,命名为newspaper
(2)新建一个Application,取名newspaper,然后点击工具栏上的DB Profile,新建一个MSS Microsoft SQL Server,填入Profile Name,服务器名,用户名,密码,数据库,如下图,然后输入连接数据库的主要代码:
open(w_welcome)
// Profile newspaper
SQLCADBMS = "MSS Microsoft SQL Server"
SQLCADatabase = "newspaper"
SQLCAServerName = "CHINA-41CD782EF"
SQLCALogId = "sa"
SQLCALogPass=""
SQLCAAutoCommit = False
SQLCADBParm = ""
connect;
if sqlcasqlcode<>0 then
messagebox("错误","数据库连接错误,程序将关闭!",stopsign!)
return
end if
close(w_welcome)
open(w_login)
(3)制作登录页面w_login,在“确定”按钮输入如下:
“注册”按钮代码:open(w_register) //打开用户注册页面
“退出”按钮代码:close(w_login) //退出本系统
(4)制作注册窗口w_register,在“注册”按钮的代码如下:
“取消”按钮代码:close(w_register)
open(w_login)
(5)制作管理员主菜单w_adminview,建管理员主界面w_adminview,将该菜单放到窗口中
(6)制作用户主菜单w_userview,建用户主界面w_userview,将菜单放到窗口中
(7)制作管理员主菜单里的录入报刊信息窗口w_inmagazine,录入用户信息窗口w_inuser,
制作数据窗口dw_magagrid,dw_magafree,dw_userfree,dw_usergrid,在数据窗口调整好外观,添加控件,并设定相应的动作,分别放到这两个窗口中
这两个窗口功能相识,在窗口中输入:
dw_1settransobject(sqlca)
dw_1retrieve()
dw_2settransobject(sqlca)
dw_2retrieve()
(8)制作管理员主菜单中的查询订阅信息窗口w_searchorder,制作数据窗口dw_booksearch,将其放入窗体中,在窗口中输入代码:
dw_1settransobject(sqlca)
dw_1retrieve()
sle_1setfocus()
在“查询”按钮中输入代码:
“预览”按钮的代码:
“关闭”按钮代码:close(w_searchorder)
数据窗口字段如下:
(9)制作管理员主菜单中的统计用户订单窗口w_statuser,统计部门订单窗口w_statdept,统计报刊订单窗口w_statnews:制作统计数据窗口dw_statnews,dw_statuser,dw_statdept将dw_statnews,dw_statuser,dw_statdept分别放入w_statnews, w_statuser,w_statdept中;以下仅列出按出按部门统计的代码和界面 (按用户、报刊统计类似,略);
按部门统计代码:
窗口代码:
按部门统计数据窗口:
dw_1settransobject(sqlca)
dw_1retrieve()
预览键代码:(与上页预览代码相同)
退出:close(parent)
(10)管理员主菜单中的更改登录在w_adminview中的代码
(11)管理员主菜单中的退出系统在w_adminview中的代码
(12)管理员主菜单中的数据库备份窗口w_backup,“开始备份”按钮的代码如下
在“>>”按钮带输入代码:
(13)管理员主菜单中的数据库恢复窗口w_restore,“开始恢复”按钮的代码如下
在“>>”按钮带输入代码:
在“开始恢复”按钮输入代码:
(14)用户主菜单的订阅报刊窗口w_userorder
该系统中定义了一个全局变量gs_userid,其它窗口界面都可以使用该变量,并显示用户名,用户登录后,它会显示“~~~~,欢迎使用本系统!”的欢迎界面。
窗口代码:
dw_1settransobject(sqlca)
dw_1retrieve()
sle_1setfocus()
sle_2text=gs_userid
“清空”按钮代码:
sle_1text=""
sle_3text=""
sle_5text=""
“退出”按钮代码:
close(w_userorder)
“订阅”按钮代码:
(14)用户主菜单的查询订单窗口w_usersearch,将订单查找dw_booksearch放到窗口里,在窗口中过过滤器筛选中用户自己的订单信息,一打开就可以看到自己的订单信息,可打印和预览结果
窗口代码:
“预览”和“退出”按钮同上
(15)用户主菜单的查询订单窗口w_userstatis,将用户统计dw_statuser放到窗口里,在窗口中过过滤器筛选中用户自己的订单信息,一打开就可以看到自己的订单信息,可打印和预览结果,窗口代码如下:
用户统计dw_statuser数据窗口如下:
“预览”“退出”按钮略
(16)用户主菜单中的修改用户信息窗口w_usermodify,打开会先显示出你的信息,而用户名这一栏是输入不了的,也就是不能修改用户名,窗口代码如下:
“保存”按钮代码如下:
(17)用户主菜单中的更改登录和退出系统的代码和管理员的一样,这里就省略了。
73系统使用结果
打开本系统,首先d出欢迎界面,通常一闪而过,然后到了登录界面,点击“注册”
按确定后,d出“恭喜,您已注册成功!”的对话框。如果这时刷新服务管理器,打开SQL Server企业管理器,打开该数据库的用户表,就可看到刚才注册的用户已经在表中了
然后返回到登陆页面,输入刚才注册到的用户名和密码maishning,123456
登录后,d出一个窗口,有供用户使用的菜单,界面显示“~~~~,欢迎使用本系统”
选择“订阅”菜单,在这个订阅界面,用户可以浏览到所有的报刊信息,要订阅报刊时,用户不需输入用户名与密码,只需输入您要订阅的报刊代号(该报刊代号必须是报刊表中存在的),订阅份数(必须是小于8的整数才有效),然后选择需要订阅的月数(一月、一季、半年或一年)然后点击“订阅”按钮
订阅成功后,系统d出“恭喜!你已成功订阅该报刊,总金额是~~~~”确定后会显示出您所订阅的总额是多少元,按“清空”按钮后可以订阅其它报刊(同样的报刊不可重复订阅)
再订阅其它报刊,然后按“退出”按钮,来到用户主菜单然后选择“查询”菜单,这个数据窗口经过过滤,一打开就直接显示该用户过订阅的订单,可以进行预览和打印。
由于权限的限制,“统计”菜单中的也是只能统计自己订单信息的数据
在“退订”报刊菜单中,可以查看自己的订单,单击“退订”然后“保存”即可完成退订
在“修改”信息菜单中,用户名也是不可输入的文本框,即不可修改用户名,其它信息可以修改,保存后它会自动添加到数据库中
选择菜单上的“注销”,可以用不同的身份进入系统,确定后回到登录界面
以管理员的身份登录,用户名111,密码111,按登录按键,可看到管理员菜单
选择菜单栏中的录入->录入报刊信息,管理员可以大致浏览所有报刊信息,在上面的数据窗口可以查看上一页和下一页的具体内容,并且可以对其进行添加,删除、修改、保存等 *** 作。
录入用户信息页面,基本相似
选择菜单栏中的“查询”->“订单信息”,管理员拥有的权限可以看到所有的订单信息
管理员也可以根据需要分别按部门、按用户、按报刊查询,比如,要查询msishning用户,在文本框中输入关键字,选择单选按钮中的“按部门号”,点击“查询”,结果如下
可对全部订单或查询出来的订单进行预览和打印,方便使用
菜单栏中的“统计”菜单有三个子菜单,管理员可以分别统计用户订单信息、部门订单信息和报刊订单信息, 直接选择就可看到统计结果,比如选择“统计用户订单信息”
可将统计出来的结果进行预览和打印,方便使用,其它两个统计功能相似,略
主菜单中的系统维护->数据库备份,选择备份的位置,然后“开始备份”
主菜单中的系统维护->数据库恢复,选择之前备份的文件,输入路径和数据库名,然后“开始恢复”
74系统评价:
数据库的设计跟编程语言没关系,是E-R模型的设计以及e-r模型到关系模型的转化。
我觉得你的意思是编写对数据库 *** 作的程序。
建议先用VB入门。看看使用ADO的方式访问数据库。先建一个简单的ACCESS数据库。然后在vb里面依次创建CONNECTION,COMMAND,RECORDSET对象即可,只需要几句代码就能修改数据和查询数据。前提是你熟悉SQL也可以使用ActiveX控件-ADODC和datagrid,不用编程就能看到数据显示。
vc也是一样。
一、数据库设计过程
数据库技术是信息资源管理最有效的手段。
数据库设计是指:对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,有效存储数据,满足用户信息要求和处理要求。
数据库设计的各阶段:
A、需求分析阶段:综合各个用户的应用需求(现实世界的需求)。
B、在概念设计阶段:形成独立于机器和各DBMS产品的概念模式(信息世界模型),用E-R图来描述。
C、在逻辑设计阶段:将E-R图转换成具体的数据库产品支持的数据模型,如关系模型,形成数据库逻辑模式。然后根据用户处理的要求,安全性的考虑,在基本表的基础上再建立必要的视图(VIEW)形成数据的外模式。
D、在物理设计阶段:根据DBMS特点和处理的需要,进行物理存储安排,设计索引,形成数据库内模式。
1 需求分析阶段
需求收集和分析,结果得到数据字典描述的数据需求(和数据流图描述的处理需求)。
需求分析的重点:调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求。
需求分析的方法:调查组织机构情况、各部门的业务活动情况、协助用户明确对新系统的各种要求、确定新系统的边界。
常用的调查方法有: 跟班作业、开调查会、请专人介绍、询问、设计调查表请用户填写、查阅记录。
分析和表达用户需求的方法主要包括自顶向下和自底向上两类方法。自顶向下的结构化分析方法(Structured Analysis,简称SA方法)从最上层的系统组织机构入手,采用逐层分解的方式分析系统,并把每一层用数据流图和数据字典描述。
数据流图表达了数据和处理过程的关系。系统中的数据则借助数据字典(Data Dictionary,简称DD)来描述。
2 概念结构设计阶段
通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型,可以用E-R图表示。
概念模型用于信息世界的建模。概念模型不依赖于某一个DBMS支持的数据模型。概念模型可以转换为计算机上某一DBMS支持的特定数据模型。
概念模型特点:
(1) 具有较强的语义表达能力,能够方便、直接地表达应用中的各种语义知识。
(2) 应该简单、清晰、易于用户理解,是用户与数据库设计人员之间进行交流的语言。
概念模型设计的一种常用方法为IDEF1X方法,它就是把实体-联系方法应用到语义数据模型中的一种语义模型化技术,用于建立系统信息模型。
作者: 小灵, 出处:论坛, 责任编辑: 李书琴, 2007-09-27 15:17
本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……
21 第零步——初始化工程
这个阶段的任务是从目的描述和范围描述开始,确定建模目标,开发建模计划,组织建模队伍,收集源材料,制定约束和规范。收集源材料是这阶段的重点。通过调查和观察结果,业务流程,原有系统的输入输出,各种报表,收集原始数据,形成了基本数据资料表。
22 第一步——定义实体
实体集成员都有一个共同的特征和属性集,可以从收集的源材料——基本数据资料表中直接或间接标识出大部分实体。根据源材料名字表中表示物的术语以及具有 “代码”结尾的术语,如客户代码、代理商代码、产品代码等将其名词部分代表的实体标识出来,从而初步找出潜在的实体,形成初步实体表。
23 第二步——定义联系
IDEF1X模型中只允许二元联系,n元联系必须定义为n个二元联系。根据实际的业务需求和规则,使用实体联系矩阵来标识实体间的二元关系,然后根据实际情况确定出连接关系的势、关系名和说明,确定关系类型,是标识关系、非标识关系(强制的或可选的)还是非确定关系、分类关系。如果子实体的每个实例都需要通过和父实体的关系来标识,则为标识关系,否则为非标识关系。非标识关系中,如果每个子实体的实例都与而且只与一个父实体关联,则为强制的,否则为非强制的。如果父实体与子实体代表的是同一现实对象,那么它们为分类关系。
24 第三步——定义码
通过引入交叉实体除去上一阶段产生的非确定关系,然后从非交叉实体和独立实体开始标识侯选码属性,以便唯一识别每个实体的实例,再从侯选码中确定主码。为了确定主码和关系的有效性,通过非空规则和非多值规则来保证,即一个实体实例的一个属性不能是空值,也不能在同一个时刻有一个以上的值。找出误认的确定关系,将实体进一步分解,最后构造出IDEF1X模型的键基视图(KB图)。
25 第四步——定义属性
从源数据表中抽取说明性的名词开发出属性表,确定属性的所有者。定义非主码属性,检查属性的非空及非多值规则。此外,还要检查完全依赖函数规则和非传递依赖规则,保证一个非主码属性必须依赖于主码、整个主码、仅仅是主码。以此得到了至少符合关系理论第三范式的改进的IDEF1X模型的全属性视图。
26 第五步——定义其他对象和规则
定义属性的数据类型、长度、精度、非空、缺省值、约束规则等。定义触发器、存储过程、视图、角色、同义词、序列等对象信息。
3 逻辑结构设计阶段
将概念结构转换为某个DBMS所支持的数据模型(例如关系模型),并对其进行优化。设计逻辑结构应该选择最适于描述与表达相应概念结构的数据模型,然后选择最合适的DBMS。
将E-R图转换为关系模型实际上就是要将实体、实体的属性和实体之间的联系转化为关系模式,这种转换一般遵循如下原则:一个实体型转换为一个关系模式。实体的属性就是关系的属性。实体的码就是关系的码。
数据模型的优化,确定数据依赖,消除冗余的联系,确定各关系模式分别属于第几范式。确定是否要对它们进行合并或分解。一般来说将关系分解为3NF的标准,即:
表内的每一个值都只能被表达一次。
表内的每一行都应该被唯一的标识(有唯一键)。
表内不应该存储依赖于其他键的非键信息。
作者: 小灵, 出处:论坛, 责任编辑: 李书琴, 2007-09-27 15:17
本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……
4 数据库物理设计阶段
为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)。根据DBMS特点和处理的需要,进行物理存储安排,设计索引,形成数据库内模式。
5 数据库实施阶段
运用DBMS提供的数据语言(例如SQL)及其宿主语言(例如C),根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。 数据库实施主要包括以下工作:用DDL定义数据库结构、组织数据入库 、编制与调试应用程序、数据库试运行 ,(Data Definition Language(DDL数据定义语言)用作开新数据表、设定字段、删除数据表、删除字段,管理所有有关数据库结构的东西)
●Create (新增有关数据库结构的东西,属DDL)
●Drop (删除有关数据库结构的东西,属DDL)
●Alter (更改结构,属DDL)
6 数据库运行和维护阶段
在数据库系统运行过程中必须不断地对其进行评价、调整与修改。内容包括:数据库的转储和恢复、数据库的安全性、完整性控制、数据库性能的监督、分析和改进、数据库的重组织和重构造。
7 建模工具的使用
为加快数据库设计速度,目前有很多数据库辅助工具(CASE工具),如Rational公司的Rational Rose,CA公司的Erwin和Bpwin,Sybase公司的PowerDesigner以及Oracle公司的oracle Designer等。
ERwin主要用来建立数据库的概念模型和物理模型。它能用图形化的方式,描述出实体、联系及实体的属性。ERwin支持IDEF1X方法。通过使用 ERwin建模工具自动生成、更改和分析IDEF1X模型,不仅能得到优秀的业务功能和数据需求模型,而且可以实现从IDEF1X模型到数据库物理设计的转变。ERwin工具绘制的模型对应于逻辑模型和物理模型两种。在逻辑模型中,IDEF1X工具箱可以方便地用图形化的方式构建和绘制实体联系及实体的属性。在物理模型中,ERwin可以定义对应的表、列,并可针对各种数据库管理系统自动转换为适当的类型。
设计人员可根据需要选用相应的数据库设计建模工具。例如需求分析完成之后,设计人员可以使用Erwin画ER图,将ER图转换为关系数据模型,生成数据库结构;画数据流图,生成应用程序。
二、数据库设计技巧
1 设计数据库之前(需求分析阶段)
1) 理解客户需求,包括用户未来需求变化。
2) 了解企业业务类型,可以在开发阶段节约大量的时间。
3) 重视输入(要记录的数据)、输出(报表、查询、视图)。
4) 创建数据字典和ER 图表
数据字典(Data Dictionary,简称DD)是各类数据描述的集合,是关于数据库中数据的描述,即元数据,不是数据本身。(至少应该包含每个字段的数据类型和在每个表内的主外键)。
数据项描述: 数据项名,数据项含义说明,别名,数据类型,长度,取值范围,取值含义,与其他数据项的逻辑关系
数据结构描述: 数据结构名,含义说明,组成:[数据项或数据结构]
数据流描述: 数据流名,说明,数据流来源,数据流去向, 组成:[数据结构],平均流量,高峰期流量
数据存储描述: 数据存储名,说明,编号,流入的数据流,流出的数据流,组成:[数据结构],数据量,存取方式
处理过程描述: 处理过程名,说明,输入:[数据流],输出:[数据流],处理:[简要说明]
ER 图表和数据字典可以让任何了解数据库的人都明确如何从数据库中获得数据。ER图对表明表之间关系很有用,而数据字典则说明了每个字段的用途以及任何可能存在的别名。对SQL 表达式的文档化来说这是完全必要的。
5) 定义标准的对象命名规范
数据库各种对象的命名必须规范。
作者: 小灵, 出处:论坛, 责任编辑: 李书琴, 2007-09-27 15:17
本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……
2 表和字段的设计(数据库逻辑设计)
表设计原则
1) 标准化和规范化
数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式,但Third Normal Form(3NF)通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说,遵守3NF 标准的数据库的表设计原则是:“One Fact in One Place”即某个表只包括其本身基本的属性,当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。它具有以下特点:有一组表专门存放通过键连接起来的关联数据。
2) 数据驱动
采用数据驱动而非硬编码的方式,许多策略变更和维护都会方便得多,大大增强系统的灵活性和扩展性。
举例,假如用户界面要访问外部数据源(文件、XML 文档、其他数据库等),不妨把相应的连接和路径信息存储在用户界面支持的表里。如果用户界面执行工作流之类的任务(发送邮件、打印信笺、修改记录状态等),那么产生工作流的数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上,如果过程是数据驱动的,你就可以把相当大的责任推给用户,由用户来维护自己的工作流过程。
3) 考虑各种变化
在设计数据库的时候考虑到哪些数据字段将来可能会发生变更。
4) 表名、报表名和查询名的命名规范
(采用前缀命名)检查表名、报表名和查询名之间的命名规范。你可能会很快就被这些不同的数据库要素的名称搞糊涂了。你可以统一地命名这些数据库的不同组成部分,至少你应该在这些对象名字的开头用 Table、Query 或者 Report 等前缀加以区别。如果采用了 Microsoft Access,你可以用 qry、rpt、tbl 和 mod 等符号来标识对象(比如 tbl_Employees)。用 sp_company 标识存储过程,用 udf_ (或者类似的标记)标识自定义编写的函数。
字段设计原则:
1) 每个表中都应该添加的3 个有用的字段。
dRecordCreationDate,在SQL Server 下默认为GETDATE()
sRecordCreator,在SQL Server 下默认为NOT NULL DEFAULT USER
nRecordVersion,记录的版本标记;有助于准确说明记录中出现null 数据或者丢失数据的原因
时效性数据应包括“最近更新日期/时间”字段。时间标记对查找数据问题的原因、按日期重新处理/重载数据和清除旧数据特别有用。
2) 对地址和电话采用多个字段
描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的灵活性。还有,电话号码和邮件地址最好拥有自己的数据表,其间具有自身的类型和标记类别。
3) 表内的列[字段]的命名规则(采用前缀/后缀命名)、采用有意义的字段名
对列[字段]名应该采用标准的前缀和后缀。如键是数字类型:用 _N 后缀;字符类型:_C 后缀;日期类型:_D 后缀。再如,假如你的表里有好多“money”字段,你不妨给每个列[字段]增加一个 _M 后缀。
作者: 小灵, 出处:论坛, 责任编辑: 李书琴, 2007-09-27 15:17
本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……
假设有两个表:
Customer 和 Order。Customer 表的前缀是 cu_,所以该表内的子段名如下:cu_name_id、cu_surname、cu_initials 和cu_address 等。Order 表的前缀是 or_,所以子段名是:
or_order_id、or_cust_name_id、or_quantity 和 or_description 等。
这样从数据库中选出全部数据的 SQL 语句可以写成如下所示:
Select From Customer, Order Where cu_surname = "MYNAME" ;
and cu_name_id = or_cust_name_id and or_quantity = 1
在没有这些前缀的情况下则写成这个样子(用别名来区分):
Select From Customer, Order Where Customersurname = "MYNAME" ;
and Customername_id = Ordercust_name_id and Orderquantity = 1
第 1 个 SQL 语句没少键入多少字符。但如果查询涉及到 5 个表乃至更多的列[字段]你就知道这个技巧多有用了。
5) 选择数字类型和文本类型的长度应尽量充足
假设客户ID 为10 位数长。那你应该把数据库表字段的长度设为12 或者13 个字符长。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模的增长了。
6) 增加删除标记字段
在表中包含一个“删除标记”字段,这样就可以把行标记为删除。在关系数据库里不要单独删除某一行;最好采用清除数据程序而且要仔细维护索引整体性。
7) 提防大小写混用的对象名和特殊字符
采用全部大写而且包含下划符的名字具有更好的可读性(CUSTOMER_DATA),绝对不要在对象名的字符之间留空格。
8) 小心保留词
要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突,比如,用 DESC 作为说明字段名。后果可想而知!DESC 是 DESCENDING 缩写后的保留词。表里的一个 SELECT 语句倒是能用,但得到的却是一大堆毫无用处的信息。
9) 保持字段名和类型的一致性
在命名字段并为其指定数据类型的时候一定要保证一致性。假如字段在表1中叫做“agreement_number”,就别在表2里把名字改成 “ref1”。假如数据类型在表1里是整数,那在表2里可就别变成字符型了。当然在表1(ABC)有处键ID,则为了可读性,在表2做关联时可以命名为 ABC_ID。
10) 避免使用触发器
触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器,你最好集中对它文档化。
作者: 小灵, 出处:论坛, 责任编辑: 李书琴, 2007-09-27 15:17
本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……
3 选择键和索引(数据库逻辑设计)
参考:《SQL优化-索引》一文
4 数据完整性设计(数据库逻辑设计)
1) 完整性实现机制:
实体完整性:主键
参照完整性:
父表中删除数据:级联删除;受限删除;置空值
父表中插入数据:受限插入;递归插入
父表中更新数据:级联更新;受限更新;置空值
DBMS对参照完整性可以有两种方法实现:外键实现机制(约束规则)和触发器实现机制用户定义完整性:
NOT NULL;CHECK;触发器
2) 用约束而非商务规则强制数据完整性
采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。不要依赖于商务层保证数据完整性;它不能保证表之间(外键) 的完整性所以不能强加于其他完整性规则之上。如果你在数据层确实采用了约束,你要保证有办法把更新不能通过约束检查的原因采用用户理解的语言通知用户界面。
3) 强制指示完整性
在有害数据进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。
4) 使用查找控制数据完整性
控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找:国家代码、状态代码等。
5) 采用视图
为了在数据库和应用程序代码之间提供另一层抽象,可以为应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。
6) 分布式数据系统
对分布式系统而言,在你决定是否在各个站点复制所有数据还是把数据保存在一个地方之前应该估计一下未来 5 年或者 10 年的数据量。当你把数据传送到其他站点的时候,最好在数据库字段中设置一些标记,在目的站点收到你的数据之后更新你的标记。为了进行这种数据传输,请写下你自己的批处理或者调度程序以特定时间间隔运行而不要让用户在每天的工作后传输数据。本地拷贝你的维护数据,比如计算常数和利息率等,设置版本号保证数据在每个站点都完全一致。
7) 关系
如果两个实体之间存在多对一关系,而且还有可能转化为多对多关系,那么你最好一开始就设置成多对多关系。从现有的多对一关系转变为多对多关系比一开始就是多对多关系要难得多。
8) 给数据保有和恢复制定计划
考虑数据保存策略并包含在设计过程中,预先设计你的数据恢复过程。采用可以发布给用户/开发人员的数据字典实现方便的数据识别同时保证对数据源文档化。编写在线更新来“更新查询”供以后万一数据丢失可以重新处理更新。
9) 用存储过程让系统做重活
提供一整套常规的存储过程来访问各组以便加快速度和简化客户程序代码的开发。数据库不只是一个存放数据的地方,它也是简化编码之地。
本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……
5 其他设计技巧
1) 避免使用触发器
触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器,你最好集中对它文档化。
2) 使用常用英语(或者其他任何语言)而不要使用编码
在创建下拉菜单、列表、报表时最好按照英语名排序。假如需要编码,可以在编码旁附上用户知道的英语。
3) 保存常用信息
让一个表专门存放一般数据库信息非常有用。在这个表里存放数据库当前版本、最近检查/修复(对Access)、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库,当客户抱怨他们的数据库没有达到希望的要求而与你联系时,这样做对非客户机/服务器环境特别有用。
4) 包含版本机制
在数据库中引入版本控制机制来确定使用中的数据库的版本。时间一长,用户的需求总是会改变的。最终可能会要求修改数据库结构。把版本信息直接存放到数据库中更为方便。
5) 编制文档
对所有的快捷方式、命名规范、限制和函数都要编制文档。
采用给表、列、触发器等加注释的 数据库工具。对开发、支持和跟踪修改非常有用。
对数据库文档化,或者在数据库自身的内部或者单独建立文档。这样,当过了一年多时间后再回过头来做第2 个版本,犯错的机会将大大减少。
6) 测试、测试、反复测试
建立或者修订数据库之后,必须用用户新输入的数据测试数据字段。最重要的是,让用户进行测试并且同用户一道保证选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。
7) 检查设计
在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说,针对每一种最终表达数据的原型应用,保证你检查了数据模型并且查看如何取出数据。
三、数据库命名规范
1 实体(表)的命名
1) 表以名词或名词短语命名,确定表名是采用复数还是单数形式,此外给表的别名定义简单规则(比方说,如果表名是一个单词,别名就取单词的前4 个字母;如果表名是两个单词,就各取两个单词的前两个字母组成4 个字母长的别名;如果表的名字由3 个单词组成,从头两个单词中各取一个然后从最后一个单词中再取出两个字母,结果还是组成4 字母长的别名,其余依次类推)
对工作用表来说,表名可以加上前缀WORK_ 后面附上采用该表的应用程序的名字。在命名过程当中,根据语义拼凑缩写即可。注意:将字段名称会统一成大写或者小写中的一种,故中间加上下划线。
作者: 小灵, 出处:论坛, 责任编辑: 李书琴, 2007-09-27 15:17
本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……
举例:
定义的缩写 Sales: Sal 销售;
Order: Ord 订单;
Detail: Dtl 明细;
则销售订单明细表命名为:Sal_Ord_Dtl;
2) 如果表或者是字段的名称仅有一个单词,那么建议不使用缩写,而是用完整的单词。
举例:
定义的缩写 Material Ma 物品;
物品表名为:Material, 而不是 Ma
但是字段物品编码则是:Ma_ID;而不是Material_ID
3) 所有的存储值列表的表前面加上前缀Z
目的是将这些值列表类排序在数据库最后。
4) 所有的冗余类的命名(主要是累计表)前面加上前缀X
冗余类是为了提高数据库效率,非规范化数据库的时候加入的字段或者表
5) 关联类通过用下划线连接两个基本类之后,再加前缀R的方式命名,后面按照字母顺序罗列两个表名或者表名的缩写。
关联表用于保存多对多关系。
如果被关联的表名大于10个字母,必须将原来的表名的进行缩写。如果没有其他原因,建议都使用缩写。
举例:表Object与自身存在多对多的关系,则保存多对多关系的表命名为:R_Object;
作者: 小灵, 出处:论坛, 责任编辑: 李书琴, 2007-09-27 15:17
本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……
2 属性(列)的命名
1) 采用有意义的列名
表内的列要针对键采用一整套设计规则。每一个表都将有一个自动ID作为主健,逻辑上的主健作为第一组候选主健来定义;
A、如果是数据库自动生成的编码,统一命名为:ID
B、如果是自定义的逻辑上的编码则用缩写加“ID”的方法命名,即“XXXX_ID”
C、如果键是数字类型,你可以用_NO 作为后缀;
D、如果是字符类型则可以采用_CODE 后缀
E、对列名应该采用标准的前缀和后缀。
举例:销售订单的编号字段命名:Sal_Ord_ID;如果还存在一个数据库生成的自动编号,则命名为:ID。
2) 所有的属性加上有关类型的后缀
注意,如果还需要其它的后缀,都放在类型后缀之前。
注: 数据类型是文本的字段,类型后缀TX可以不写。有些类型比较明显的字段,可以不写类型后缀。
3) 采用前缀命名
给每个表的列名都采用统一的前缀,那么在编写SQL表达式的时候会得到大大的简化。这样做也确实有缺点,比如破坏了自动表连接工具的作用,后者把公共列名同某些数据库联系起来。
3 视图的命名
1) 视图以V作为前缀,其他命名规则和表的命名类似;
2) 命名应尽量体现各视图的功能。
4 触发器的命名(尽量不使用)
触发器以TR作为前缀,触发器名为相应的表名加上后缀,Insert触发器加'_I',Delete触发器加'_D',Update触发器加'_U',如:TR_Customer_I,TR_Customer_D,TR_Customer_U。
5 存储过程名
存储过程应以'UP_'开头,和系统的存储过程区分,后续部分主要以动宾形式构成,并用下划线分割各个组成部分。如增加代理商的帐户的存储过程为'UP_Ins_Agent_Account'。
6 变量名
变量名采用小写,若属于词组形式,用下划线分隔每个单词,如@my_err_no。
7 命名中其他注意事项
1) 以上命名都不得超过30个字符的系统限制。变量名的长度限制为29(不包括标识字符@)。
2) 数据对象、变量的命名都采用英文字符,禁止使用中文命名。绝对不要在对象名的字符之间留空格。
3) 小心保留词,要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突
4) 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了。
以上就是关于数据库表结构设计,常见的数据库管理系统全部的内容,包括:数据库表结构设计,常见的数据库管理系统、什么是数据库的实例、200分2天内求大学本科数据库课程设计!急!急!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)