数据建模
软件开发
分析,设计,编码,测试,部署,上线,运维
数据建模
概念建模,逻辑建模,物理建模
概念建模:客户交流,理解需求,行程实体
逻辑建模:对概念建模阶段的实体进行细化,优化,测试等,最后形成具体的E-R图
物理建模:在逻辑建模阶段创建的实体关系图,根据选择使用的数据库,转为相应的SQL代码
数据库设计
数据建模完成后,可以把 E-R 图转换为数据库中的表
- 实体的名字转换为表的名字
- 实体的属性转换为表中的列
- 具有唯一特点的属性设置为表中的主键
- 根据实体关系,设置表中某列的外键列
主键
作用:就是用来唯一标识一行数据的
特点:
- 主键列满足非空且唯一
- 满足非空且唯一的列都可作为主键
- 可以让表中一个有意义的列作为主键
- 可以找一个没意义的列作为主键(桥表)
- 可以多个列联合在一起作为主键
外键
作用:用来标识这个类中的数据,是引用另一种表的一个字段值
特点:
- 表中的某列声明为外键列,一般外键列都会引用另一张表的主键(具有唯一约束的列都可被引用)
- 一张表的主键列 中出现过的值,都可以在另一张表的外键列中使用
- 外键列 值可以为空,前提是这个列没有作为主键或联合主键
- 如果引用联合主键,那么外键就是一个联合外键
规则
1. 一对一关系
假设是A表和B表,外键列设置在任意一张表中,都是可以的
2. 一对多关系
假设是A表和B表,外键列设置在多的一方
3. 多对多
假设是A表和B表,需要设计第三张表——桥表,桥表中设置两个外键,分别引用A表和B表的主键
建表
-- 格式1 -- 格式2
create table 表名( create table 表名(
字段名 数据类型 [列约束类型], 字段名 数据类型 [列约束类型],
字段名 数据类型 [列约束类型], 字段名 数据类型 [列约束类型],
字段名 数据类型 [列约束类型], 字段名 数据类型 [列约束类型],
字段名 数据类型 [列约束类型], 字段名 数据类型 [列约束类型],
字段名 数据类型 [列约束类型] [表级约束], [表级约束]
); );
命名
- 必须是字母开头
- 必须是 1-30 个字符之间的长度
- 表名中只能出现字母,数字,_ , #
- 不能和数据库中已有对象的名字重复
- 不能是数据库中的关键字
数据类型
- char varchar varchar2 都是存储字符串
- char 存储数据的长度固定。varchar2 的存储数据的长度是可变的
- char 效率比 varchar2 效率高。varchar 是数据库标准类型,varchar2 类型是 oracle 数据库特有的
- varchar2 不能存空字符串,可以存null。varchar2 可以存空字符串
- oracle 建议使用 varchar2
- number(p,s)
- p 表示最大位数(整数位+小数位),s 表示保留的小数位(四舍五入),可为负数
- 例:number(5,2) 存123.456,取123.46,整数位3位,小数位两位。无参,无限制
- date 日期类型
- blob 存二进制对象,例如视频,图片,音频
- clob 存储大文本
约束
- 主键约束 primary key
- 外键约束 foreign key
- 唯一约束 unique
- 非空约束 not null
- check约束 check
列的约束又分为:列级约束,表级约束
列级约束和表级约束对比:
- 列级约束和表级约束所写位置不同
- not null 约束不能用表级约束来表明
- 表级约束和列级约束声明语法稍有所不同
- 如果要声明的约束为联合主键,联合外键,联合唯一的时候,就一定要用表级约束
constraint 关键字:
- constraint 是约束的意思
- 建表的时候可以给约束起名字,这个名字起的规律一般是:表名_列名_约束类型
- 如果没有给约束起名字,那么系统也会给这个约束起一个默认的名字
- 将来我们可以根据之前给约束起好的名字,而找到这个约束,然后进行修改获取其他操作
特殊:在建表时,还有一些特殊情况
create table test2
as
select * from s_dept where 1=2;//1=1
DML语句
DML用于改变数据库中的数据,主要包括:insert update delete
可省略列,但是值必须和表中所有的列一一对应
insert into table_name(列1,列2,列3...) values(值1,值2,值3...);
不写条件,就是把表中对应的列全部更改
update table_name set 列1=值1,列2=值2,... where 条件;
delete from table_name where 条件;
delete on
on delete xxx 在声明外键约束的时候使用
在删除A表中的一条数据,这条数据被B表中的外键列所引用,这个时候 on delete xxx 语句的设置可以告诉 oracle 这个时候如何处理
- on delete no action
- on delete cascade
- on delete set null
在建外键的时候,不加 on delete 语句,默认是 on delete no action
数据库事务
在数据库中操作数据,对数据进行更新访问一系列操作,所组成的一个执行逻辑单元。
特征
- 原子性:一个事务所有的操作要么全部成功说要么全部失败
- 一致性:事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态
- 隔离性:每个事务相互独立
- 持久性:事务所做的影响,在事务结束之后是持久的
回滚
在进行事务回滚的时候,默认回滚到指定的位置
同时,在事务中,可设置多个回滚点,让事务回滚到指定位置
使用关键字 savepoint
DML语句1
savepoint A
DML语句2
savepoint B
rollback to A/B
隔离
默认情况下,事务中经常发生一下问题
- 脏读
- 主要针对 update 操作,一个事务A读到另一个事务B中修改过的数据,但是还没有提交。
- 不可重复读
- 主要针对 update操作,事务A在两次读取之间,另一个事务B更改数据并提交。在A中出现两次读取的数据不同
- 幻读
- 主要针对 insert 和 delete 操作,在A中筛选了 5 条数据,第二次筛选有 6条数据。这是因为事务B在事务A两次筛选之间进行了插入的操作,并满足筛选条件。
事务隔离级别:
- read-uncommitted 不提交也能读
- read-committed 提交之后才能读,解决脏读
- repeatable-read 解决了脏读和不可重复读
- serializable 三个问题都解决了
Set Transaction Isolation Level ...;