数据库设计
数据结构复杂时,我们需要进行数据库设计
良好的数据库设计作用:
节省数据存储空间
保证数据的完整性
方便进行数据库应用程序的开发
糟糕的数据库设计
数据冗余,空间浪费
数据修改或插入造成异常
数据库设计借助于E-R(Entity-Relationship)图进行建模设
关系数据库的设计共有6种设计范式,一般数据库必须满足三种范式。
数据规范规定,要先满足前一个范式才能看当前的范式。
第一范式:确保每列的原子性
如果每列都是不可再分割的单元,则满足第一范式
第二范式:表中的每一行数据都必须被唯一区分,且其他列和主键关联
主键列 多对多的关系可以忽略
第三范式:表中所有列都应直接关联主键,即不能存在其他表中主键以外的字段
如果表需要频繁使用另一张表的列,且这个列无法直接获得,需要通过其他表多重关联,这种情况不需要考虑。
数据表之间的关系:一对一,一对多,多对多,多对一
数据表的创建过程:
1、对项目需求进行分析建模
2、根据数据建模创建数据表
3.、对表实施三范式规范
4、为表添加完整性约束,保证数据的完整性(写入数据表的数据时可靠准确的数据)
5、对表进行增删改查的操作访问
数据的完整性
完整性 = 数据+可靠+准确
Oracle数据类型
数值类型
number
数值父类型,表示整数和浮点数
number(
,
)
第一个参数表示数据的总长度,第二个参数表示小数位数
int/integer 整数
float 双精度浮点数
字符类型
char 定长字符,最大2000B
使用定义长度
nchar 定长unicode字符,最大1000B
varchar2 变长字符,最大4000B
nvarchar2 变长unicode字符,最大1000B
long 变长字符字符,最大4GB(过时类型)
日期类型 date 日期 固定7B
大对象类型 lob 8-12TB数据并可分段处理
clob 字符大对象,存储单字节的字符数据
blob
用于存储二进制数据
数据表操作
创建数据表 ,号分隔,最后一条不要加逗号
create table 表名
(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型
)
删除数据表
drop table 表名;
修改数据表
添加列 添加的新列值为null
alter table 表名 add 列名 数据类型;
修改列(只是修改原来列的数据类型) 修改的列在空白的情况下执行;如果更改同类型时精度必须高于原数据类型
alter table 表名 modify 原列名 新数据类型;
删除列
alter table 表名 drop column 列名;
数据完整性
1、域完整性
2、实体完整性
3、引用完整性
4、自定义完整性
1、域完整性约束实现方式:
1)设置列的数据类型
2)非空约束
3)默认约束
4)检查约束
5)外键约束
2)非空约束(指定单列值必须填写不能为null)
添加非空约束
alter table 表名 modify 列名 not null;
alter table users modify username not null;
建议在建表的时候写入
如:
create table users
(
username varchar2(50) not null
)
3) 默认约束(指定列当没有写入数据时也能以默认值呈现)
添加默认值在建表时写入
create table 表名
(
列名 数据类型 default(默认值)
)
create table users
(
userId int,
--添加非空约束
userName varchar2(50) not null,
birthday date not null,
--添加默认约束
remoke clob default('个人信息备注'),
--添加主键
constraint pk_users_userId primary key(userId)
)
4)检查约束(对单列的数据进行有效性验证)
检查约束支持条件运算符 和 逻辑运算符(and or)
alter table 表名 add constraint 约束名 check(约束条件)
约束名按照
ck_表名_列名 书写
--添加检查约束,要求性别只能是女或者是男
alter table users add constraint ck_users_sex check(sex = '男' or sex = '女')
alter table users add constraint ck_users_sex check(sex in ('男','女'));
例:添加检查约束,要求年龄必须在18到40之间
alter table users add constraint ck_users_age check(age >= 18 and age <= 40)
alter table users add constraint ck_users_age check(age in(18,19,20,21,22.........40))
alter table users add constraint ck_users_age check(age between 18 and 40)
检查约束中的通配符 _ %,必须结合like关键字使用
_ 下划线表示单个的任意字符 %百分号表示任意长度的任意字符
如:添加检查约束,要求用户的姓名必须是 t 开头
alter table users add constraint ck_users_username check(username like 't%');
用户姓名中必须要有 t
alter table users add constraint ck_users_username check(username like '%t%');
5)外键约束(当数据表的数据需要引用另一张表的数据必须建立外键约束)
子表中引用主表的主键的列称为外键,被引用的表的成为主表。
主键中被引用的列必须是主键或者唯一键。
alter table 表名 add constraint 外键约束名 foreign key(外键名) references 主表名(主表主键名)
外键约束名 = fk_表名_子表的列
外键名 = 子表的列名
--添加外键约束
alter table score add constraint fk_score_stuId foreign key(stuId) references student(stuId)
2、实体完整性约束的实现方式
1)主键 :主键用于唯一标识表中行数据的列,一张表只能有一个主键,主键不能为null
主键设定原则:
唯一性、稳定性
主键添加
alter table 表名 add constraint 主键名 primary key(列名);
主键名= pk_表名_列名
建表的时候添加主键
create table users
(
userId int,
--添加非空约束
userName varchar2(50) not null,
birthday date not null,
--添加默认约束
remoke clob default('个人信息备注'),
--添加主键
constraint pk_users_userId primary key(userId)
)
主键删除
alter table 表名 drop primary key;
组合主键
例:在同一个班里不允许有同名的学生,不同班级允许有同名学生
--使用组合键实现同一个班级不允许有同名的学生,不同班级允许有同名学生
alter table student add constraint pk_student primary key(stuName,classId)
2)唯一键:用于标注某个数据列不重复,一张表允许出现多个唯一键
添加唯一键
alter table 表名 add constraint 约束名 unique(列名);
约束名 = uq_表名_列名
--添加唯一键
alter table users add constraint uq_users_userName unique(userName)
3、引用完整性约束的实现方式:
1)外键约束
(同 域完整性约束的外键约束)
4、自定义完整性约束的实现方式:
1)触发器(后面讲)