数据库设计
一、数据库设计的三范式
第一范式:
是对属性的原子性,要求属性具有原子性,不可再分解。
如下表结构设计
create table Student
(
StuId varchar(20) primary key, --学号
StuName varchar(20) not null, --姓名
StuContact varchar(50) not null --联系方式
);
insert into Student(StuId,StuName,StuContact)
values('001','刘备','QQ:187830840;Tel:1367843729');
上述设计不满足第一范式,联系方式这一列并不是不可再分的最小单元,应修改为以下结构
create table Student
(
StuId varchar(20) primary key, --学号
StuName varchar(20) not null, --姓名
Tel varchar(20) not null, --电话
QQ varchar(20) not null --QQ
);
第二范式:
是对记录的唯一性,要求记录有唯一的标识,即实体的唯一性,即不存在部分依赖。
如有下表结构设计:
--选课成绩表
create table StudentCourse
(
StuId varchar(20) not null, --学号
StuName varchar(20) not null, --学生姓名
CourseId varchar(20) not null, --课程号
CourseName varchar(20) not null, --课程名
CourseScore int not null --课程分数
);
insert into StudentCourse(StuId,StuName,CourseId,CourseName,CourseScore)
values('001','刘备','001','语文',80);
insert into StudentCourse(StuId,StuName,CourseId,CourseName,CourseScore)
values('001','刘备','002','数学',70);
insert into StudentCourse(StuId,StuName,CourseId,CourseName,CourseScore)
values('002','关羽','003','英语',80);
insert into StudentCourse(StuId,StuName,CourseId,CourseName,CourseScore)
values('003','张飞','003','英语',90);
上述设计的有两个事物,一个学生信息,一个课程信息,很显然这两个事物都没有保证实体的唯一性,这里的姓名依赖学号,课程名依赖课程编号,所以不符合二范式。
create table Course --课程
(
CourseId int primary key identity(1,1), --课程号
CourseName varchar(30) not null, --课程名
CourseContent text --课程介绍
);
insert into Course(CourseName,CourseContent) values('HTML','静态网页制作');
insert into Course(CourseName,CourseContent) values('winForm','windows应用程序开发');
create table Student --学生
(
StuId int primary key identity(1,1), --学号
Stuname varchar(50) not null , --学生名字
StuSex char(2) not null --学生性别
);
insert into Student(Stuname,StuSex) values('刘备','男');
insert into Student(Stuname,StuSex) values('关羽','男');
create table Exam --考试
(
StuId int references Student(StuId) not null, --学号
CourseId int references Course(CourseId) not null, --课程号
Score int not null, --考试分数
primary key(StuId,CourseId)
);
insert into Exam(StuId,CourseId,Score) values('1','1','90');
insert into Exam(StuId,CourseId,Score) values('1','2','80');
insert into Exam(StuId,CourseId,Score) values('2','2','85');
第三范式:
要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖。
如有下表结构设计
create table Student
(
StuId varchar(20) primary key, --学号
StuName varchar(20) not null, --学生姓名
ProfessionalId int not null, --专业编号
ProfessionalName varchar(50), --专业名称
ProfessionlRemark varchar(200) --专业介绍
);
insert into Student(StuId,StuName,ProfessionalId,ProfessionalName,ProfessionlRemark)
values('001','刘备',1,'计算机','最牛的专业');
insert into Student(StuId,StuName,ProfessionalId,ProfessionalName,ProfessionlRemark)
values('002','关羽',2,'工商管理','管理学的基础专业');
insert into Student(StuId,StuName,ProfessionalId,ProfessionalName,ProfessionlRemark)
values('003','张飞',1,'计算机','最牛的专业');
上述设计这种专业名称字段和专业介绍字段,在数据库中会产生很多冗余数据,不满足第三范式,优化方案如下:
create table Professional
(
ProfessionalId int primary key identity(1,1), --专业编号
ProfessionalName varchar(50), --专业名称
ProfessionalRemark varchar(200), --专业介绍
)
create table Student
(
StuId varchar(20) primary key, --学号
StuName varchar(20) not null, --学生姓名
ProfessionalId int references Professional(ProfessionalId) not null --专业编号
)
insert into Professional(ProfessionalName,ProfessionalRemark)
values('计算机','最牛的专业');
insert into Professional(ProfessionalName,ProfessionalRemark)
values('工商管理','管理学的基础专业');
insert into Student(StuId,StuName,ProfessionalId)
values('001','刘备',1);
insert into Student(StuId,StuName,ProfessionalId)
values('002','关羽',2);
insert into Student(StuId,StuName,ProfessionalId)
values('003','张飞',1);
二、表关系
表关系(一对一,一对多,多对多)
一对多
--专业表,学生表
create table Profession --专业表
(
ProId int primary key identity(1,1), --专业编号
ProName varchar(50) not null --专业名称
)
create table Student
(
StuId int primary key identity(1,1), --学生编号
ProId int not null, --专业编号
StuName varchar(50) not null, --学生姓名
StuSex varchar(2) not null --学生性别
)
一对一
--学生基本信息,学生详细信息
create table StudentBasicInfo --学生基本信息
(
StuId varchar(20) primary key, --学号
StuName varchar(50) not null, --学生姓名
StuSex nvarchar(1) not null --性别
)
create table StudentDetailInfo --学生详细信息
(
StuId varchar(20) primary key, --学号
StuQQ varchar(20), --QQ
StuPhone varchar(20), --电话
StuMail varchar(100), --邮箱
StuBirth date --生日
)
多对多
--学生信息,学生课程,添加一张表表示关系
create table Student --学生表
(
StuId int primary key identity(1,1), --学号
StuName varchar(50) not null, --学生名字
StuSex varchar(2) not null --学生性别
)
create table Course --课程表
(
CourseId int primary key identity(1,1), --课程编号
CourseName varchar(50) not null, --课程名称
CourseContent text --课程介绍
)
create table Exam --考试信息表
(
StuId int references Student(StuId) not null, --学号
CourseId int references Course(CourseId) not null, --课程号
Score int not null, --考试分数
primary key(StuId,CourseId)
)
设计数据库
--业务需求说明
--模拟银行业务
--1.银行开户(注册个人信息)及开卡(办理银行卡)
--(一个人可办理多个银行卡,但做多只有3个)
--2.存钱
--3.查询金额
--4.取钱
--5.转账
--6.查看交易记录
--7.账户挂失
--8.账户注销
--表设计
--1.账户信息表
--2.银行卡表
--3.交易信息表(存储转钱和取钱的记录)
--4.转账信息表(存储转账信息记录)
--5.状态信息变化表(存储银行卡状态:1.正常2.挂失3.冻结4.注销)
--表结构设计
create table AccountInfo --账户信息表
(
AccountId int primary key identity(1,1), --账户编号
AccountCode varchar(20) not null, --身份证号码
RealName varchar(20) not null, --真实姓名
AccountPhone varchar(20) not null, --电话号码
OpenTime datetime not null default(getdate()) --开户时间
)
create table BankCard --银行卡表
(
CardId varchar(30) primary key, --银行卡号
AccountId int references AccountInfo(AccountId) not null, --账户编号
CardPwd varchar(20) not null, --银行卡密码
CardMoney money not null, --银行卡余额
CardState int not null, --1.正常2.挂失3.冻结4.注销
CardTime datetime default(getdate()) --开卡时间
)
create table CardExchange --交易信息表
(
ExchangeId int primary key identity(1,1), --交易自动编号
CardId varchar(30) references BankCard(CardId) not null, --银行卡号
MoneyInBank money not null, --存钱金额
MoneyOutBank money not null, --取钱金额
ExchangeTime datetime default(getdate()) --交易时间
)
create table CardTransfer --转账信息表(存储桩长信息表)
(
TransferId int primary key identity(1,1), --转账自动编号
CardIdOut varchar(30) references BankCard(CardId) not null,--转出银行卡号
CardIdIn varchar(30) references BankCard(CardId) not null,--转入银行卡号
TransferMoney money not null, --交易金额
TransferTime datetime default(getdate()) --交易时间
)
--状态信息变化表(存储银行卡状态:1.正常2.挂失3.冻结4.注销)
create table CardStateChange
(
StateId int primary key identity(1,1), --状态信息自动编号
CardId varchar(30) references BankCard(CardId) not null, --银行卡号
OldState int not null, --之前的状态
NewState int not null, --新状态
StateWhy varchar(200) not null, --状态变化的原因
StateTime datetime default(getdate()) --记录产生的原因
)
标签:10,varchar,--,数据库,20,int,设计,null,StuId
From: https://www.cnblogs.com/Starry-blog/p/16797313.html