首页 > 数据库 >10.数据库设计

10.数据库设计

时间:2022-10-17 12:47:12浏览次数:42  
标签:10 varchar -- 数据库 20 int 设计 null StuId

数据库设计

一、数据库设计的三范式

第一范式:
是对属性的原子性,要求属性具有原子性,不可再分解。

如下表结构设计

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

相关文章

  • 设计原则
    分离关注点分离关注点是开发时的指导原则。此原则主张应根据软件执行的工作类型将软件分离。从体系结构上来说,按此原则有逻辑地构建应用程序应将核心业务行为与基础结构......
  • [教你做小游戏] 用JS实现平均每步仅占10bit位的象棋历史记录保存方案(decode篇)
    背景兄弟们,之前我开发了支持联机对战的五子棋、斗地主、UNO。在大家的呼吁之下,我准备开发「象棋」啦!......
  • 2202-10-17
    30F:当前下一笔进行中,做空  5F:下跌中枢构筑中,等反弹一笔的类2卖 计划:做空等5F反弹等1F上涨结束开空 ......
  • QFramework v1.0 使用指南 工具篇:10. FSMKit 状态机
    QFramework内置了一个简易的状态机,基本使用如下:链式usingUnityEngine;namespaceQFramework.Example{publicclassIStateBasicUsageExample:MonoBehaviour......
  • 学生成绩智能分析系统—教师端的设计与实现
    技术框架:SSM+Maven+Mysql+Tomcat功能实现:用户管理、年级管理、班级管理、教师管理、学生管理、排课管理、考试管理、考点管理、考试知识点统计分析预测、成绩打印等.........
  • 【服务器虚拟化数据恢复】Xen Server环境下虚拟机的虚拟磁盘被破坏的数据库数据恢复案
    服务器虚拟化数据恢复环境:Dell某型号服务器;数块STAT硬盘通过raid卡组建的RAID10;XenServer服务器虚拟化系统;故障虚拟机操作系统:WindowsServer,部署Web服务,存储网站文件......
  • 两种常用压控电流源设计
    电流源是一种非常常用的电路,如工业中4-20mA输出,LED恒流驱动,以及一些传感器可能也需要恒流驱动等。本篇文章介绍两种常见的压控电流源电路的设计。废话不多说,直接看图:电路很......
  • Connection:数据库连接对象
    功能获取执行sql的对象StatementcreateStatement() PreparStatementprepareStatement(Stringsql)管理事务开启事务setAutoCommit(boolean......
  • 称重系统设计
    1.传感器简介称重系统在工业级日常生活中应用非常广泛,从小型的电子称到大型的地磅。其中传感器大部分为电阻应变式压力传感器。一般由四个电阻应变片组成惠更斯电桥,安装在弹......
  • Connection数据库连接对象
    功能获取执行sql的对象StatementcreateStatement()  PreparedStatementprepareStatement(Stringsql);管理事务开启事务:setAutoCommit(boo......