数据建模
数据库设计
大致分为:
系统设计中一个重要的环节就是数据库设计
数据库设计的时候需要先进行数据建模(实体关系图 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)
1)# : 唯一, 以后可能表示为主键
2)* : 非空
3)o : 可有可无
4)虚线: may be 顾客这边虚线,顾客可能没有订单
5)实线: must be 订单这边实线,订单一定是属于某个客户。
6)竖杠(|): 代表要强制在(|)一方建立一个联合主键,将对方ID拿过来做联合主键
7)伞状图标代表多的一方,不是伞状图标则代表一的一方
设计关系数据库时,遵从不同的规范要求,才能设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:
第一范式(1NF)
第二范式(2NF)
第三范式(3NF)
巴斯-科德范式(BCNF)
第四范式(4NF)
第五范式(5NF,又称完美范式)
注:满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了
表中的非主键列都必须直接依赖于主键列,而不能间接的依赖.
(不能产生依赖传递)
例如这样设计一张表:
订单表: 订单编号 是主键
订单编号 订单名称 顾客编号 顾客姓名
顾客编号依赖于订单编号,顾客姓名依赖于顾客编号,从而顾客姓名间接的依赖于订单编号,那么这里产生了依赖传递,所以这个设计是不满足第三范式的
今天学习了数据建模和数据库设计相关概念知识。
建表
create table 表名(
列名1 数据类型 列级约束,
列名2 数据类型 列级约束,
列名3 数据类型 列级约束,
列名4 数据类型 列级约束
);
create table 表名(
列名1 数据类型 ,
列名2 数据类型 ,
列名3 数据类型 列级约束,
列名4 数据类型 列级约束,
表级约束1,
表级约束2
);
建表过程中,需要:
约束分为列级约束和表级约束,都是对值进行约束。如列的值不能为空,列的值必须是唯一的等约束。
注:列级约束也称为行级约束
列级约束和表级约束可以写也可以不写。例如:
create table 表名(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
列名4 数据类型
);
1.主键约束 PRIMARY KEY primary key
2.外键约束 FOREIGN KEY foreign key
3.唯一约束 UNIQUE unique
4.非空约束 NOT NULL not null
5.check约束 CHECK check
//普通的建表例子
create table student(
id number primary key,
name varchar2(200) not null,
age number,
birthday date
);
drop table student;
//使用四种列级约束 主键约束 非空约束 唯一约束 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;
//使用列级约束 声明 外键约束
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是级联的意思
//使用表级约束
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)不能声明成表级约束
//使用表级约束 声明 外键约束
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;
//使用表级约束 声明 联合唯一约束
create table student(
id number primary key,
class varchar2(50) not null,
name varchar2(50) not null,
unique(class,name)
);
drop table student;
注意:学生的班级和学生的名字联合起来必须是唯一的(联合唯一)
注意:联合唯一约束必须使用表级约束来声明
//使用表级约束 声明 联合主键
create table t_customer(
id number,
name varchar2(50),
primary key(id,name)
);
drop table t_customer;
//使用表级约束 声明 联合外键
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.如果要声明的约束为联合主键、联合外键、联合唯一的时候,就一定要用表级约束.
1.constraint是约束的意思
2.建表的时候可以给约束起一个名字,这个名字起的规律一般会是:表名_列名_约束类型
3.如果没有给约束起名字,那么系统也会给这个约束起一个默认的名字,这不过这个默认的名字对我们来说并不友好(我们看不懂)
4.将来我们可以根据我们之前给约束起好的名字而找到这个约束,然后进行修改
//列级约束 起约束名字
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;
//表级约束 起约束名字
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的表结构和表中的数据全部复制过来
create table test1
as
select * from s_dept;
//只拿来s_dept的表结构,没有数据
create table test2
as
select * from s_dept
where 1=2;
//只复制表中某几个列以及数据
create table test3
as
select id,last_name,salary from s_emp;
ON DELETE CASCADE
on delete cascade
这个语句是在建表中,声明外键约束的时候一个可选项,我们后面的DML章节中再进一步讨论
一对一关系建表
一对多关系建表
多对多关系建表
最近很多都是概念性知识,实际操作的东西也就是需要大量记忆,我感觉对数据库这方面不太敏感,需要提高一下学习技巧,最好是提高记忆力。