Oracle数据库整理-(中后篇...)

三.数据建模和数据库设计

数据建模

实体-关系图
  1. 实体-关系图(Entity RelationshipDiagram),也称为E-R图,提供了表示实体、属性和关系的方法,用来描述现实世界的概念模型。

  2. 构成E-R图的基本要素是实体、属性和关系

  3. 实体(Entity):实体用来表示具有相同特征和性质的事物(类似于java的类),实体由实体名和实体属性来表示。

  4. 属性(Attribute):实体所具有的某一特性,一个实体可以有若干个属性

  5. 关系(Relationship):实体彼此之间相互连接的方式称为关系。一般可分为以下 3 种类型:
    一对一关系 (1 ∶ 1)
    一对多关系 (1 ∶ N)
    多对多关系 (M ∶ N)
    may-be 和 must-be

  6. 在实体与实体之间的关系中,都会存在着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图转换成数据中的表
1.实体的名字转换为表的名字
2.实体的属性转换为表中的列
3.具有唯一特点的属性设置为表中的主键
4.根据实体之间的关系设置为表中某列为外键列(主外键关联)
注意:第四步主要是:实体关系—>表关系

设计关系数据库时,遵从不同的规范要求,才能设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

目前关系数据库有六种范式:
  1. 第一范式(1NF)
  2. 第二范式(2NF)
  3. 第三范式(3NF)
  4. 巴斯-科德范式(BCNF)
  5. 第四范式(4NF)
  6. 第五范式(5NF,又称完美范式)

注:满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了

第一范式:
    一个表中,每个列里面的值是不能再分割的.
    例如:我们设计的表中有一个列是:爱好
    这个列的值可能会是这样:足球篮球乒乓球
    但是这值是可以再分割的:足球、篮球、乒乓球
    所以这种设计是不满足第一范式

第二范式:
	第二范式是在满足第一范式的基础上
    表中的非主键列都必须依赖于主键列
    例如:
    订单表: 订单编号 是主键
    订单编号  订单名称   订单日期  订单中产品的生产地
    这几个非主键列中,产品生产地是不依赖于订单编号的,所以这种设计是不满足第二范式

第三范式:
	第三范式是在满足第二范式的基础上
	表中的非主键列都必须直接依赖于主键列,而不能间接的依赖.
	(不能产生依赖传递)
    例如:
    订单表:   订单编号 是主键
    订单编号  订单名称  顾客编号  顾客姓名
    顾客编号依赖于订单编号,顾客姓名依赖于顾客编号,从而顾客姓名间接的依赖于订单编号,那么这里产生了依赖传递,所以这个设计是不满足第三范式的

四.数据库建表

了解主键和外键

  • 主键:

    1.能做主键的列必要满足非空唯一的特点
    2.只要满足非空唯一的任何列都可以做主键
    3.可以让表中一个有意义的列做主键,比如说学号,它既表示学生学号又作为表中的主键,因为这个列满足非空唯一的条件
    4.也可以找一个没有意义的列做主键,就是用来唯一标识一行记录的
    5.我们可以让多个列联合在一起做表中的主键,那么它就是联合主键,要求这几个列的值联合在一起是非空唯一的

  • 外键:
    1.表中的某一个列声明为外键列,一般这个外键列的值都会引用于另外一张表的主键列的值(有唯一约束的列就可以,不一定非要引用主键列)
    2.另外一张表的主键列中出现过的值都可以在外键列中使用,没有出现过的值,都不能使用
    3.外键列值也可以为空的,提前是这个外键列在表中不做主键,因为我们也可以把表中的外键列当做主键来使用(只有满足非空唯一的要求就可以)
    4.如果把B表中的联合主键的值引用到A表中做外键,因为是俩个列在B表中做联合主键,那么A表引用过来的时候也要把俩个列的值都引用过来,那么它们在A表中就会作为一个联合外键出现

建表

create table 表名(
列名1 数据类型 列级约束,
列名2 数据类型 列级约束,
列名3 数据类型 列级约束,
列名4 数据类型 列级约束
);
create table 表名(
列名1 数据类型 列级约束,
列名2 数据类型 列级约束,
列名3 数据类型 列级约束,
列名4 数据类型 列级约束,
表级约束1,
表级约束2
);
根据以上格式,可以看出,建表过程中,需要以下几种东西:
1.关键字
2.表名
3.列名
4.数据类型
5.约束
6.固定格式
其中,约束分为列级约束(因为是跟在列的声明后面写的)和表级约束(因为是在全部列声明完之后写的),列级约束和表级约束都是对列中的值进行约束的,例如:列的值不能为空,列的值必须是唯一的等等
注:列级约束也称为行级约束
表名的要求:
1.必须是字母开头
2.必须是1-30个字符之间的长度
3.表名中只能出现A–Z, a–z, 0–9, _, $, #
4.不能和数据库中已有对象的名字重复
5.不能是数据库中的关键字
列的约束
列的约束就是对这个列中的值的要求
1.主键约束 PRIMARY KEY primary key
2.外键约束 FOREIGN KEY foreign key
3.唯一约束 UNIQUE unique
4.非空约束 NOT NULL not null
5.check约束 CHECK check

例:使用四种列级约束 主键约束 非空约束 唯一约束 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
);

例:使用列级约束 声明 外键约束

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)
);

注意:订单表中的外键列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,
	email varchar2(20),
	gender char,
	primary key(id),
	unique(emil),
	check(gender in('f','m'))
)

例:使用表级约束 声明 外键约束

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)
);

例:使用表级约束 声明 联合唯一约束

create table student(
			id number primary key,
			class varchar2(50) not null,
			name varchar2(50) not null,
			unique(class,name)
);

表级约束和列级约束对比
1.表级约束和列级约束所写的位置不一样
2.not null约束不能用表级约束来声明
3.表级约束和列级约束声明语法稍有所不同
4.如果要声明的约束为联合主键、联合外键、联合唯一的时候,就一定要用表级约束.

constraint关键字
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
);

例:表级约束 起约束名字

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)
);

五:数据字典

  1. 常见的数据字典(它们都是视图)

    USER开头的视图里面存放着用户自己拥有的对象(表、视图、索引、同义词、序列)
    ALL开头的视图存放着用户有权限查看的对象
    DBA开头的视图存放着数据库所有的对象
    V$开头的视图存放数据库运行的一些性能属性数据

  2. 以user开头的数据字典

    包含当前用户所拥有的相关对象信息。
    //查询用户拥有的所有表的名字
    select table_name from user_tables;
    //查询用户对象表,找出对象类型是TABLE类型的对象名字
    //table view sequence index(只要是唯一的列,默认索引) synonym等都是oracle中的对象
    //查询出s_emp表中的约束名字
    select constraint_name
    from user_constraints
    where table_name = ‘S_EMP’;

  3. 以all开头的数据字典
    包含当前用户有权限访问的所有对象的信息
    //查到当前用户有权限访问的对象
    select table_name from all_tables;

  4. 以dba开头的数据字典
    包含数据库所有相关对象的信息。
    //只能是有dba权限的用户查询,能查到数据库中所有对象
    select table_name from dba_tables;
    (conn切换用户,输入用户名system, 输入密码oracle)

  5. 其他视图
    dictionary视图中只有俩列:
    TABLE_NAME 表示当前【表的名字】
    COMMENTS 表示对这个【表的描述】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值