(四)数据建模和数据库设计
学习内容
数据建模
数据库设计
软件开发的步骤
大致分为:
- 需求分析
- 系统设计
- 编码实现
- 系统测试
- 运行维护
系统设计中一个重要的环节就是数据库设计
数据库设计的时候需要先进行数据建模(实体关系图 E-R图)
数据建模的依据就是前期所做的需求分析
数据建模
1.Model of system in client’s mind
2.Entity model of client’s model
3.Table model of entity model
4.Tables on disk
实体-关系图
实体-关系图(Entity Relationship Diagram),也称为E-R图,提供了表示实体、属性和关系的方法,用来描述现实世界的概念模型。
构成E-R图的基本要素是实体、属性和关系
实体(Entity):实体用来表示具有相同特征和性质的事物(类似于java的类),实体由实体名和实体属性来表示。
属性(Attribute):实体所具有的某一特性,一个实体可以有若干个属性
关系(Relationship):实体彼此之间相互连接的方式称为关系。一般可分为以下 3 种类型:
一对一关系 (1 ∶ 1)
一对多关系 (1 ∶ N)
多对多关系 (M ∶ N)
may-be 和 must-be
- 在实体与实体之间的关系中,都会存在着may-be和must-be这俩种情况,例如:
系统中有顾客和订单俩个实体(1:N关系),一个顾客对应多个订单,一个订单对应一个顾客,而且一个顾客可以(may be)没有订单和他对应,一个订单一定(must be)会有顾客和它对应.
ER图中符号的表示
1)# : 唯一, 以后可能表示为主键
2)* : 非空
3)o : 可有可无
4)虚线: may be 顾客这边虚线,顾客可能没有订单
5)实线: must be 订单这边实线,订单一定是属于某个客户。
6)竖杠(|): 代表要强制在(|)一方建立一个联合主键,将对方ID拿过来做联合主键
7)伞状图标代表多的一方,不是伞状图标则代表一的一方
数据库设计
- 数据建模完成之后,可以把ER图转换成数据中的表
- 实体的名字转换为表的名字
- 实体的属性转换为表中的列
- 具有唯一特点的属性设置为表中的主键
- 根据实体之间的关系设置为表中某列为外键列(主外键关联)
注意:第四步主要是:实体关系—>表关系
设计关系数据库时,遵从不同的规范要求,才能设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:
第一范式(1NF)
第二范式(2NF)
第三范式(3NF)巴斯-科德范式(BCNF)
第四范式(4NF)
第五范式(5NF,又称完美范式)注:满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了
第一范式:
- 一个表中,每个列里面的值是不能再分割的.
例如这样设计一张表:
表中有一个列是:爱好
这个列的值可能会是这样:足球篮球乒乓球
但是这值是可以再分割的:足球、篮球、乒乓球
所以这种设计是不满足第一范式
第二范式:
- 第二范式是在满足第一范式的基础上
- 表中的非主键列都必须依赖于主键列
例如这样设计一张表:
订单表: 订单编号 是主键
订单编号 订单名称 订单日期 订单中产品的生产地 - 这几个非主键列中,产品生产地是不依赖于订单编号的,所以这种设计是不满足第二范式
- 表中的非主键列都必须依赖于主键列
第三范式:
- 第三范式是在满足第二范式的基础上
表中的非主键列都必须直接依赖于主键列,而不能间接的依赖.
(不能产生依赖传递)
例如这样设计一张表:
订单表: 订单编号 是主键
订单编号 订单名称 顾客编号 顾客姓名顾客编号依赖于订单编号,顾客姓名依赖于顾客编号,从而顾客姓名间接的依赖于订单编号,那么这里产生了依赖传递,所以这个设计是不满足第三范式的
了解主键和外键
主键
- 能做主键的列必要满足非空唯一的特点
- 只要满足非空唯一的任何列都可以做主键
- 可以让表中一个有意义的列做主键,比如说学号,它既表示学生学号又作为表中的主键,因为这个列满足非空唯一的条件
- 也可以找一个没有意义的列做主键,就是用来唯一标识一行记录的,例如ID
- 我们可以让多个列联合在一起做表中的主键,那么它就是联合主键,要求这几个列的值联合在一起是非空唯一的
外键
- 表中的某一个列声明为外键列,一般这个外键列的值都会引用于另外一张表的主键列的值(有唯一约束的列就可以,不一定非要引用主键列)
- 另外一张表的主键列中出现过的值都可以在外键列中使用,没有出现过的值,都不能使用
- 外键列值也可以为空的,提前是这个外键列在表中不做主键,因为我们也可以把表中的外键列当做主键来使用(只有满足非空唯一的要求就可以)
- 如果把B表中的联合主键的值引用到A表中做外键,因为是俩个列在B表中做联合主键,那么A表引用过来的时候也要把俩个列的值都引用过来,那么它们在A表中就会作为一个联合外键出现
总结
今天学习了数据建模和数据库设计相关概念知识。
Oracle day4+
学习内容
建表
建表的格式
create table 表名(
列名1 数据类型 列级约束,
列名2 数据类型 列级约束,
列名3 数据类型 列级约束,
列名4 数据类型 列级约束
);create table 表名(
列名1 数据类型 ,
列名2 数据类型 ,
列名3 数据类型 列级约束,
列名4 数据类型 列级约束,
表级约束1,
表级约束2
);建表过程中,需要:
- 关键字
- 表名
- 列名
- 数据类型
- 约束
- 固定格式
约束分为列级约束和表级约束,都是对值进行约束。如列的值不能为空,列的值必须是唯一的等约束。
注:列级约束也称为行级约束列级约束和表级约束可以写也可以不写。例如:
create table 表名(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
列名4 数据类型
);
表名
- 字母开头
- 1-30个字符长度
- 只能出现A–Z, a–z, 0–9, _, $, #
- 不能和对象名重复
- 不能是数据库中关键字
列的常用数据类型
- char
- varchar
- varchar2
- number
- date
其他类型 BLOB CLOB
BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的
char varchar varchar2的区别及特点
- CHAR长度固定,VARCHAR2的长度可变;
- CHAR效率比VARCHAR2的效率稍高;
- VARCHAR是数据库标准的字符类型;
- VARCHAR2是Oracle自己开发的数据类型;
- VARCHAR2存储NULL值;
- Oracle建议使用VARCHAR2。
列的约束
1.主键约束 PRIMARY KEY primary key
2.外键约束 FOREIGN KEY foreign key
3.唯一约束 UNIQUE unique
4.非空约束 NOT NULL not null
5.check约束 CHECK check
列级约束/行级约束
- 在列的后面直接加上的约束。
create table 表名(
列名1 数据类型 列级约束,
列名2 数据类型 列级约束,
列名3 数据类型 列级约束,
列名4 数据类型 列级约束
);
表级约束
- 在所有列声明以后加的约束。
create table 表名(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
列名4 数据类型,
表级约束1,
表级约束2
);
建表实例
例1:
//普通的建表例子create table student(id number primary key,name varchar2(200) not null,age number,birthday date);drop table student;
例2:
//使用四种列级约束 主键约束 非空约束 唯一约束 check约束create table student(id number primary key,name varchar2(100) not null,email varchar2(100) unique,gender char(1) check(gender in('f','m')),age number,birthday date);drop table student;
例3:
//使用列级约束 声明 外键约束create table t_customer(id number primary key,name varchar2(200) not null);create table t_order(id number primary key,content varchar2(200) not null,customer_id number references t_customer(id));drop table t_customer;drop table t_order;
注意:订单表中的外键列customer_id的值引用自顾客表t_customer中的主键列id的值
1.这时候直接删除顾客表是不行的,因为t_customer的主键列的值被别的表给引用了.
2.我们可以先删除订单表t_order,然后再删除t_customer就可以了
3.如果非要想直接删除到顾客表t_customer,就需要使用下面的语句:
drop table t_customer cascade constraints;
4.该语句表示,删除t_customer表的同时,也级联删除与表相关的约束,外键约束没有了,这个表自然可以被删除掉
5.cascade是级联的意思
例4:
//使用表级约束create table student(id number,name varchar2(20) not null,age number default 20,email varchar2(100),gender char,primary key(id),unique(email),check(gender in('f','m')));drop table student;
注:非空约束(not null)不能声明成表级约束
例5:
//使用表级约束 声明 外键约束create table t_customer(id number primary key,name varchar2(200) not null);create table t_order(id number primary key,content varchar2(200) not null,customer_id number,foreign key(customer_id) references t_customer(id));drop table t_order;drop table t_customer;
例6:
//使用表级约束 声明 联合唯一约束create table student(id number primary key,class varchar2(50) not null,name varchar2(50) not null,unique(class,name));drop table student;
注意:学生的班级和学生的名字联合起来必须是唯一的(联合唯一)
注意:联合唯一约束必须使用表级约束来声明
例7:
//使用表级约束 声明 联合主键create table t_customer(id number,name varchar2(50),primary key(id,name));drop table t_customer;
例8:
//使用表级约束 声明 联合外键create table t_customer(id number,name varchar(50),primary key(id,name));create table t_order(id number,price number not null,customer_id number,customer_name varchar(50),foreign key(customer_id,customer_name) references t_customer(id,name));drop table t_order;drop table t_customer;
表级约束和列级约束对比
1.表级约束和列级约束所写的位置不一样
2.not null约束不能用表级约束来声明
3.表级约束和列级约束声明语法稍有所不同
4.如果要声明的约束为联合主键、联合外键、联合唯一的时候,就一定要用表级约束.
constraint关键字
1.constraint是约束的意思
2.建表的时候可以给约束起一个名字,这个名字起的规律一般会是:表名_列名_约束类型
3.如果没有给约束起名字,那么系统也会给这个约束起一个默认的名字,这不过这个默认的名字对我们来说并不友好(我们看不懂)
4.将来我们可以根据我们之前给约束起好的名字而找到这个约束,然后进行修改
例1:
//列级约束 起约束名字create table student(id number constraint student_id_pk primary key,name varchar2(100) constraint student_name_nn not null,email varchar2(100) constraint student_email_un unique,gender char(1) constraint student_gender_ck check(gender in('f','m')),age number,birthday date);drop table student;
例2:
//表级约束 起约束名字create table t_customer(id number,name varchar2(20) not null,age number,email varchar2(100),gender char,constraint cus_id_pk primary key(id),constraint cus_email_un unique(email),constraint cus_gender_ck check(gender in('f','m')));create table t_order(id number,price number not null,customer_id number,constraint order_cid_fk foreign key(customer_id) references t_customer(id));drop table t_order;drop table t_customer;
特殊的建表:建立一张表和s_dept一模一样
例1:
//s_dept的表结构和表中的数据全部复制过来create table test1asselect * from s_dept;
例2:
//只拿来s_dept的表结构,没有数据create table test2asselect * from s_deptwhere 1=2;
例3:
//只复制表中某几个列以及数据create table test3asselect id,last_name,salary from s_emp;
ON DELETE CASCADEon delete cascade
这个语句是在建表中,声明外键约束的时候一个可选项,我们后面的DML章节中再进一步讨论
一对一关系建表
一对多关系建表
多对多关系建表
总结
最近很多都是概念性知识,实际操作的东西也就是需要大量记忆,我感觉对数据库这方面不太敏感,需要提高一下学习技巧,最好是提高记忆力。
(四)数据建模和数据库设计相关推荐
- 数据建模和数据库设计
数据建模和数据库设计 一. 实体-关系图 实体-关系图(Entity Relationship Diagram),也称为E-R图,提供了表示实体.属性和关系的方法,用 ...
- 三、数据需求与数据库设计
数据需求与数据库设计 数据需求 项目中主要包含了用户.权限(菜单).角色三种类型的数据,各种数据包含的数据项如下: (1)用户:用户名.密码.生日.头像.简介.用户类型 (2)权限:权限名称.描述.链 ...
- 篮球赛场数据统计系统数据库设计实例
篮球赛场数据统计系统数据库设计实例 研究内容(篮球赛场数据统计系统) 1)比赛前对球队.球员各项基本信息的录入功能: 2)比赛时对进球得分.各种进球类型以及裁判评判情况等数据和信息的记录功能: ...
- mysql数据库设计工具_四种优秀的数据库设计工具
[51CTO.com快译]众所周知,良好的数据库设计能够大幅减少后期的运维工作,同时也能最大程度地减少软件项目出错的可能.由于我们所面临的真实项目需求往往五花八门,因此需要找到合适的设计工具,来实现事 ...
- UML建模、数据库设计和UI设计工具
1.Rational Rose 很多人说Rose不好用,但是我觉得还是挺好用的,用了七八年了,主要是用熟了,而且也没有什么大毛病 2.XDE 2003 .Net里面,你可以用XDE,但是只有for v ...
- 成都加米谷大数据教育:数据库设计中的 9 大常见错误
成都加米谷大数据培训带你了解那些数据库带来的挑战 其中一些问题不可避免,也无法控制.但是,其中相当一部分可以追溯到数据库设计本身的质量.我们在初步阶段所做的决定会对数据库最终的工作情况有深远的影响. ...
- 大数据量下数据库设计及分库分表拆分原则
在设计数据库的建设前,首先准备工作是了解业务,然后根据业务数据进行数据库设计,设计的同时需要考虑业务数据量.可改造性.数据弱一致性.读写分离.复杂SQL多样化等: 首先,可数据根据读弱一致性可以考虑添 ...
- oracle报错数据复数,Oracle数据库设计策略及规范
Oracle数据库设计策略及规范 设计策略及规范 1. 目的 定义Oracle数据库设计规范,作为数据库规划.设计.开发以及维护人员的技术参考资料.用以规范和指导相关人员的设计行为. 2. 概述 本文 ...
- mysql的数据结构设计原则,数据库设计的重要性与原则
随着工作经验的积累,我日益感觉到,对一名程序员来说,拥有良好的数据库设计能力是很重要的,甚至是最重要的. 程序员界有一句著名的话 Talk is cheap, show me the code 把这句 ...
- 5模型数据起别名_DMBOK 06|数据建模与设计
数记达摩院 提供高效能数据知识体系学习解决方案 您好,欢迎来到数记达摩院,我是王兵.今天我们来一起学习,DMBOK数据管理知识体系 第五章 数据建模与设计. 开始之前,我们先回顾一下上节课讲述的内容. ...
最新文章
- Latex学习笔记0
- CStdioFile写文件中出现的问题
- id 怎么获取jira 评论_【JIRA】如何快速地批量查找各迭代的SprintID
- ansible软件模块参数
- 2008秋季-计算机软件基础-0922课堂用例(2)
- linux查看jdk详细版本号,linux系统上用什么命令查看本机运行的jdk的版本的
- Go语言核心之美 2.2-浮点数
- JSP的九大内置对象和四大作用域对象
- 51单片机——自动浇花系统(含全部代码)
- php连接mysql 实现登录_php如何连接mysql实现简单注册登陆页面
- sum多个字段的值相加_Excel Sumifs函数多字段多条件求和使用实例
- 获取素材列表返回40004 invalid media type.获取公众号素材mediaId
- 通过css为类生成器给文本字体加上书名号,
- java workflow 教程_建议收藏,从零开始创建一个Activiti工作流,手把手教你完成...
- 服务器ahci模式安装系统,u盘装系统硬盘模式怎么设置|u盘装系统BIOS设置ide/ahci方法...
- 计算机通信网络设备调试员(三级 高级),计算机通信网络设备调试员国家职业标准.doc...
- blend2d + MFC
- Python模块configparser:加载配置文件config.ini
- ui设计培训机构内课程包括哪些板块|优漫动游
- 答题小程序为何那么火?