SQL数据库实战需求分析→数据库设计
从这开始,就真正进⼊项⽬实战啦。先说点体会,我刚开始接触编程的时候,都是编写⼀些⼩东西,往往都是半天或者⼀天什么的就编完了,那时候根本没想过做程序之前还要有需求分析。经过快两年的学习,接触的都是⽐较⼤的系统,才明⽩没有需求分析的程序都太业余了,没有任何技术含量。对于⼀个系统来说,如果需求分析不到位,那么将有灾难性的后果,从这节的⼩标题就能看出,需求是数据库设计的基⽯,需求定了,数据库基本上就定了,数据库定了,程序的基本功能也就定了。我们以⼀个简单的学⽣管理系统为例⼦,来分析⼀下需求。分析需求地球⼈⼀般都是⽤UML图,啥是UML图呢,就是⼀种把程序⽤图形表⽰的标准,它可以表⽰需求、程序流程、程序模块、程序功能等等,可以说,UML图画完了,程序基本上就出来了,⽬前⽐较好的画UML的⼯具是Rational rose,不多说啦,剩下的就交给google了。本系统的需求⾮常简单,就是⽼师可以添加、删除、修改学⽣记录,学⽣的记录包括:学号、年级、班级、姓名、性别、年龄、备注(这些就是字段)。根据这些叙述,我们可以画出UML⽤例图(⽤例图就是⽤来分析需求的):
根据需求分析我们就可以设计数据库了,⾮常“简单”嘛,需要⼀个表就⾏了,把它命名为student表,⾥边添加刚刚提的那些字段就可以了。注意,数据库中的⼀切,包括:数据库名、表名、字段名、存储过程等等,都要⽤英⽂,不可以出现中⽂,因为咱是专业菜鸟,不⾛业余路。接着往下看,教你如何创建数据库。
作为专业教程,俺不会教你⽤⿏标建⽴数据库,咱们要⽤T-SQL语句建⽴数据库,也就是写数据库脚本。这样建⽴数据库,相当于留了个备份,⽆论到哪,只要有SQL环境,直接执⾏⼀下脚本数据就建好了,⾮常⽅便快捷,就算是第⼀次写脚本,也⽐⽤⿏标建⽴数据库快。在⼤型系统开发时,脚本还可以作为数据库维护的依据,⾮常有⽤。那么怎样写呢,打开SQL server 2005 Management Studio,输⼊帐号密码登录平台,然后点⼀下左上⾓的"新建查询"就可以打开查询分析器了,我们可以在这输⼊任何SQL语句。
第⼀步先创建数据库,我先把创建数据库的标准格式给⼤家:
create database studentManager
On primary
(
name=student_data,
filename='E:\SQL Server2008 SQLFULL_CHS\Microsoft SQL
Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\student_data.mdf',
size=3,
maxsize=unlimited,
filegrowth=1
)
Log on
(name=student_log,
filename='E:\SQL Server2008 SQLFULL_CHS\Microsoft SQL
Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\student_log.ldf',
size=1,
maxsize=20,
相信看着这个很多⼈都蒙了,简单说⼀下,其实这么多代码,也就第⼀句最重要,意思是创建⼀个名字
叫studentManager的数据库。On primary下边的是对数据库的⼀些初始设置,⽐如:路径、初始⼤⼩、增量等等。Log on下边的是对数据库⽇志的设置,也是那么⼏项。很明确的告诉⼤家,除⾮是特殊需求,否则我们没必要管那么多,默认的就够咱们⽤了,创建数据库就⼀句话:create database studentManager,输⼊完后点⼀下⼯具栏上的“执⾏”,就搞定啦。数据库建完了,就该在数据库⾥建表了,还是先给出代码:--指定数据库
use t_studentManager;
--创建t_student表
create table t_student
(
number varchar( 20) PRIMARY KEY, --PRIMARY KEY 是主键约束
grade varchar( 10) NOT NULL, --NOT NULL是⾮空约束
class varchar( 10) NOT NULL,
[ name] varchar( 20) NOT NULL, --name属于sql保留字,所以⽤⽅括号括起来
sex varchar( 1) NOT NULL CHECK(sex in ( '男', '⼥')), --CHECK约束,意思是性别字段只能是男或⼥。
age int NOT NULL,
remark varchar( 100),
addTime datetime DEFAULT( getdate()) --默认值约束,getdate()获取服务器时间
);
给⼤家解释⼀下,刚刚我们创建完数据库,在这要引⽤⼀下,也就是use,这样才可以在指定数据库中建表。
create table当然就是建表的意思了,在表名前最好加⼀个"t_",表⽰是表(table),这样容易区分,⽽且专业。括号⾥的就是这个表中的字段,格式是:字段名类型 约束,注意每个字段写完后边都要加逗号(最后⼀个就不⽤加啦),表⽰分隔。举这个例⼦,约束⽤的还是⽐较全的,重点说说约束。约束可是数据库中相当重要的东西,它保证了数据库的安全和稳定,同时也保证了数据完整性。约束主要有6种,分别是:NOT NULL约束(⾮空约束)、PRIMARY KEY约束(主键约束)、FOREIGN KEY约束(外键约束)、UNIQUE约束(唯⼀约束)、CHECK 约束(检查约束)、DEFAULT约束(默认值约束)。这些约束可以⽤在任何字段的后边,⼀个字段也可以有多个约束,⽤空格分隔即可,⽐如上边的sex字段,就同时使⽤
了⾮空约束和检查约束。当然,有些约束只能⽤⼀次,⽐如主键约束。我只是提了⼀下这些常⽤约束,⼤家了解我的⽬的就达到了,以后具体⽤到,再去google,就怕你不知道有这些约束。在查询分析器中执⾏这段代码,表就建⽴好了,提⽰⼀下:SQL查询分析器可以选中执⾏,也就是你选中那些代码就执⾏那些代码,建表的时候注意不要再次执⾏建数据库的语句哦。
五、优化数据库。
数据库设计是程序的根基,也是⼀门艺术。上⼀节我们设计的数据库,太随意了,什么都没有考虑,作为专业菜鸟,这样是不⾏的。
优化数据库,先要了解数据库设计三范式,简单说下:
1.第⼀范式:是指数据库表的每⼀列都是不可分割的基本数据项,同⼀列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
2.第⼆范式:第⼆范式需要确保数据库表中的每⼀列都和主键相关,⽽不能只与主键的某⼀部分相关(主要针对联合主键⽽⾔)。
3.第三范式:第三范式需要确保数据表中的每⼀列数据都和主键直接相关,⽽不能间接相关。
这三个范式⼤致的意思就是:数据库中表的职责要单⼀,依赖关系明确,尽量减少数据库数据冗余。从⽹上查,可以查到很多个⼈理解,我在这也不理解了,核⼼思想就是我刚刚说的。我⾸先声明,三范式只是⼀个整体的指导思想,并不可能完全遵从,有时候数据冗余未必是坏事,要考虑实际情况。
很明显,刚刚我们设计的数据库不符合三范式的要求。在此表中学⽣应该依赖的是学号,⽽我们冒昧的把班级、年级也放在了这⾥,学⽣当然也应该依赖于班级、年级。这样⼀来,表就乱了,造成的直接后果就是数据不完整,⽐如我们由于失误,插⼊了⼀个年级是100的学⽣,⽽根本就没有100这个班级。这样还有个⽐较⼤的问题就是数据冗余,因为我们每插⼊⼀个学⽣,不得不记录⼀次班级、年级,造成⼤量⽆⽤数据。所以我们要改,要把⼀个表拆成三个,分别是:年级表、班级表、学⽣表。这样⼀来,数据库就显得漂亮多了。刚刚是⼀个表,我们还应付得过来,现在三个表,记不住了怎么办?别急,刚刚提到了UML图,它可以⽤来设计数据库。在程序设计过程中,数据库中的每⼀个表,都会在程序中映射成⼀个类,⽽表中的每⼀个字段,都是类中的⼀个属性,它们的类型是⼀致的,我们管他叫做实体类(可以提前google⼀下三层架构哦),这时我们可以借助于UML中的类图画出数据库的结构。如下图:
通过UML类图,清晰的描述了表之间的关系。所以,在⼤型项⽬开发中,必须借助⼯具设计数据库,展⽰数据库的结构和关系,这样我们才能优化、改进数据库,数据库不是⼀下就能设计成功的,往往要根据需求的理解⽽发⽣变动。很多童鞋可能会问为什么⽤实体类,我只说⼀句话:⽤实体类便于在程序中对数据库进⾏操作,实体类是对数据的打包,便于数据传递。剩下的就要去google啦~不多说。这下我
们的数据库设计算是完⼯了,删掉原来的数据库,对照这UML实体类图写优化后的数据库脚本,代码如下:
--创建数据库
create database studentManager;
--指定数据库
use t_studentManager;
--创建年级表
create table t_grade
(
id bigint IDENTITY( 1, 1) PRIMARY KEY,
[ name] varchar( 10) NOT NULL
);
--创建班级表
create table t_class
(
id bigint IDENTITY( 1, 1) PRIMARY KEY,
sql数据库用什么软件打开gradeID bigint NOT NULL,
[ name] varchar( 10) NOT NULL,
CONSTRAINT FK_class_gradeID FOREIGN KEY(gradeID) REFERENCES t_grade( id) --外键约束
);
--创建t_student表
create table t_student
(
number varchar( 20) PRIMARY KEY, --PRIMARY KEY 是主键约束
classID bigint NOT NULL,
[ name] varchar( 20) NOT NULL, --name属于sql保留字,所以⽤⽅括号括起来
sex varchar( 1) NOT NULL CHECK(sex in ( '男', '⼥')), --CHECK约束,意思是性别字段只能是男或⼥。
age int NOT NULL,
remark varchar( 100),
addTime datetime DEFAULT( getdate()), --默认值约束,getdate()获取服务器时间
CONSTRAINT FK_student_classID FOREIGN KEY(classID) REFERENCES t_class( id) --外键约束
);
在讲代码之前,必须先说什么是外键约束,外键约束就是:A表的某个字段⽤到了B表的主键字段,那么A表中的这个字段就叫外键,A、B两个表间的约束关系就叫外键约束。A表的外键字段必须依赖于B表的主键字段,如果向A表外键字段中添加⼀个B表主键字段中不存在的数据,那么将失败。外键约束保证了
数据的完整性和合理性。
这段代码,我还是要重点说说约束,与上⼀次创建表不同的是,不仅仅是表多了,⽽且最后多了外键约束,CONSTRAINT是创建⼀个约束,后边接约束名;FOREIGN KEY代表该约束是外键约束,括号⾥写字段名,代表这个字段是外键;REFERENCES是参考的意思,也就是参考哪个表⾥的哪个字段,也就是主键在哪,后边接"表名(字段名)"。其实我是故意把它写在最后的边的,外键约束也是约束,完全可以放在字段定义的最后边,也就是NOT NULL那个位置上,我这样写是想告诉⼤家还有另⼀种写法,所有的约束都可以类似这样写,就是换个位置,我现在提出来避免⼤家以后见到发蒙。需要注意的是,创建表的括号⾥,⽆论是写约束还是写字段,都要⽤逗号分隔,千万别忘了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论