数据库概述07(数据库设计)

范式NF

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有5+1级范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。如果不满足所要求的范式,则将不满足范式要求的部分进行分表。一般说来,数据库只需满足第三范式(3NF)就行了。
数据库设计中的概念
实体:现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等等。值得强调的是这里所说的“事物”不仅仅是看得见摸得着的“东西”,它也可以是虚拟的,不如说“老师与学校的关系”。
属性:教科书上解释为:“实体所具有的某一特性”,由此可见,属性一开始是个逻辑概念,比如说,“性别”是“人”的一个属性。在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”。
元组:表中的一行就是一个元组。
分量:元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”。否则就不是关系数据库了。
码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么叫候选码,从候选码中挑一个出来做老大,它就叫主码。
全码:如果一个码包含了所有的属性,这个码就是全码。
主属性:一个属性只要在任何一个候选码中都出现过,这个属性就是主属性。
非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。
外码:一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。
候选码: 若关系中的某一属性或属性组的值能唯一的标识一个元组,而其任何真子集都不能再标识,则称该属性组为(超级码)候选码。
主键的定义
主键可分为2大类:自然主键和代理主键。一般建议使用代理主键
将表中的所有列的组合当作主键–候选码
去除其中某些列查看是否还能唯一标识一行数据
最后找到的所有候选码的真子集就是主码
最佳实践:可以在表中添加一个与业务无关的字段充当主键 id bigint primary key
auto_increment
NF1
所有列不可分,字段满足原子性
定义学生,学生(编号、班级编号、姓名、亲属),这个亲属列是可分的,所以将亲属列划分到另外表中,从而使剩余的列满足NF1,最终结构选择为 学生(编号、班级编号、姓名)、学生亲属(姓名、关系、外码)
NF2
消除对主键的部分依赖
定义学生,学生(编号、班级编号、姓名、宿舍楼号),主键为复合主键(编号、班级编号),这里会发现一旦班级编号确定则所属的系别就确定,系别确定则宿舍楼号确定。宿舍楼号部分依赖主键,不是依赖整个主键。解决问题的方法为分表 学生(编号、班级编号、姓名) 学生住宿 (班级编号、宿舍楼号)
NF3
消除对主键的传递依赖
定义学生,学生(学号pk、系别、宿舍楼号),主键为学号,所以自然满足NF2,但是一旦系别确定则宿舍楼号确定,所以宿舍楼号依赖于系别,不是依赖于学号。这里就是传递依赖:宿舍楼号–>系别–>学号pk。解决问题的方法为分表
范式和反范式
应用范式可以减少数据冗余,但是范式级别越高,则创建表的数量越多,查询效率则越低。所以在具体开发中经常采用降低范式要求,采用合理冗余数据的方式以提高查询效率
考虑查询效率,所以一般只达到NF3即可,甚至有时会了提高查询效率会有意降低范式要求【反范式】
经典案例:电商网站,例如京东和淘宝
商品(商品编号(pk)、商品类别)–>商品(商品编号pk,类别编号)、类目(类目标号、类目名称)
商品的数量非常庞大,而且类别要分为3个级别 101010
实际应用:商品(编号、1级类别名称、2级类别名称、3级类别名称)
表和表之间关系
表和表【实体】之间的关系有3种:
编号(PK) 姓名 性别 妻子编号 丈夫编号
1 赵小胖 true 2 null
2 王小花 false null 1
3 张毅 true null null
一对一1:1,例如一个人只能有一个身份证,一个身份证只能属于一个人
一对多或者多对一1:m或者m:1,例如一个类目可以包含多个商品,一个商品只能属于一个类目
多对多n:m,例如一个学生可以选修多门课程,一个课程可以被多个学生选修
考察表【实体】之间关系的方法:中立
一对一
一对一实现方式有2种:共享主键或者唯一外键。例如人和身份证
共享主键
在tb_person从表中id列即是当前表的主键,又是外键
唯一外键
特殊实现方式
例如一夫一妻,如何在一个表中保存所有人的信息
另外的实现方式
create table tb_card(
id bigint primary key auto_increment comment ‘不是身份证号码,仅仅是一个非业务含义
的编号’,
name varchar(32) not null,
birth date
);
create table tb_person(
id bigint primary key, – 这里的主键值来源于tb_card的主键值,主键约束非空唯一
– 人的编号来源于card表种的编号值,而且on delete cascade级联删除,表示删除对应的身份证
信息时会自动删除对应的用户信息
foreign key(id) references tb_card(id) on delete cascade,
salary decimal(8,2)
);
create table tb_card(
id bigint primary key auto_increment,
name varchar(32) not null
);
create table tb_person(
id bigint primary key auto_increment,
salary decimal(8,2),
card_id bigint not null unique,-- not null非空约束; unique唯一性约束,表示该列值不
允许重复
foreign key(card_id) references tb_card(id) on delete cascade
);
编号 姓名 性别 配偶编号
1 赵小胖 true 2
2 王小花 false 1
3 张毅 true null
数据表定义
一对多
实际上默认情况下fk外键参照主键pk则就是一对多关联,例如一个人有多辆车,一个车只能属于一个人
多对多
实际上在关系型数据库中是不能直接表达多对多关系,必须引入中间表。例如学生选修课程
create table tb_person(
id bigint primary key auto_increment,
name varchar(10) not null,
sex boolean default 1,
pei_id bigint unique,
foreign key(pei_id) references tb_person(id)
);
create table tb_person(
id bigint primary key,
name varchar(20)
);
create table tb_car(
id bigint primary key,
title varchar(32) not null,
person_id bigint not null,
foreign key(person_id) references tb_person(id)
);
create table tb_student(
id bigint primary key auto_increment comment ‘学生编号’,
name varchar(10) not null comment ‘学生姓名’
) comment ‘学生表’;
create table tb_course(
id bigint primary key auto_increment comment ‘课程编号’,
title varchar(32) not null comment ‘课程名称’
) comment ‘课程表’;
create table tb_choice(
sid bigint comment ‘学生编号’,
cid bigint comment ‘课程编号’,
– 不允许重复选修
primary key(sid,cid),
– 不允许出现的学生信息错误
foreign key(sid) references tb_student(id) on delete cascade,
PowerDesigner
Power Designer是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,他几
乎包括了数据库模型设计的全过程
计算机辅助软件工程 CASE(Computer Aided(or Assisted)Software Engineering)。原来指用
来支持管理信息系统开发的、由各种计算机辅助软件和工具组成的大型综合性软件开发环境,随着
各种工具和软件技术的产生、发展、完善和不断集成,逐步由单纯的辅助开发工具环境转化为一种
相对独立的方法论
优点
不用在使用create table等语句创建表结构,数据库语句,可以自动生成
数据库设计人员只关注如何进行数据建模即可
基本设计流程
1、创建Conceptual Data Model
stereotype套用模板
mandatory强制不可为空的意思
domain域可以理解为取值范围,定义最大值、最小值、约束。通过用户自定义后,新建实体时可
以使用域对字段属性进行快速定义。需要Model-Domains先创建后使用
2、建立实体之间的联系
– 不允许选修不存在的课程
foreign key(cid) references tb_course(id) on delete cascade
) comment ‘选课表,用于表示多对多关系’;
3、检查CDM:菜单栏的Tools选项,选择Check Model,打开检查模型的界面

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程简介: 课程总计41课时,从什么是事务讲起,直到分布式事务解决方案,很的0基础基础与提升系列课程。对于难以理解的知识点,全部用画图+实战的方式讲解。 第一部分:彻底明白事务的四个特性:原子性、一致性、隔离性、持久性,用场景和事例来讲解。 第二部分:实战讲数据库事务的6中并发异常:回滚丢失、覆盖丢失、脏读、幻读、不可重复读、MVCC精讲。 第三部分:彻底搞清楚4种事务隔离级别:READ_UNCOMMITTED 读未提交隔离级别、READ_COMMITTED 读已提交隔离级别、REPEATABLE_READ 可重复度隔离级别、SERIALIZABLE 序列化隔离级别 第四部分:彻底搞清楚MySQL的各种锁:行锁、表锁、共享锁、排它锁、Next-Key锁、间隙锁、X锁、S锁、IS锁、IX锁、死锁、索引与锁、意向锁等。 第五部分:彻底搞清楚Spring事务的7种传播级别的原理和使用:PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROPAGATION_NESTED分布式事务的理论基础:RPC定理、BASE理论、XA协议都是什么,原理是什么,有什么关联关系 第六部分:分布式事务的5种解决方案原理和优缺点:2PC两阶段提交法、3PC三阶段提交法、TCC事务补偿、异步确保策略、最大努力通知策略 第七部分:阿里巴巴分布式事务框架Seata:历经多年双十一,微服务分布式事务框架,用一个Nacos+Spring Cloud+Seta+MySql的微服务项目,实战讲解阿里的分布式事务技术,深入理解和学习Seata的AT模式、TCC模式、SAGA模式。 课程资料: 课程附带配套2个项目源码72页高清PDF课件一份阿里巴巴seata-1.1.0源码一份阿里巴巴seata-server安装包一份
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值