数据库的序列,同义词,事务,数据库的设计

序列

用于数值类型的主键

create sequence seq_stu_id
start with 1            --从1开始
increment by 1          --间隔是1
maxvalue 200            --最大时200
nocycle                 --不循环

nocache;                --可以在数据字典user_sequences查看


--如何用序列 nextval下一个值,currval当前值
select seq_stu_id.currval from dual;

同义词

synonym 相当于链接,是因为为了更快的去访问别的用户的表

由于在查表时的全称是

用户.表名

当用户A想访问用户B的表时在用户B或sys先授

grant all on 表名 to 用户A  --授所有权限

然后a就可以访问,还可以再创建一个同义词

--在sys里把授创建同义词的权力给他
grant create synonym to 用户B; 
--在用户B中创同义词
create synonym 同义词名 for 用户B.表名;

事务

将一系列操作看成原子操作

原子性,隔离性(事务中的语句相互独立),一致性(语句要么同时成功要么同时失败),持久性(commit后就保存到数据库了)

对每条数据的操作(select 不是)相当于临界区,有互斥性,只有commit 和rollback才表示完成退出临界区

使用 update 抢锁进入临界区,进行要求全部操作 全部完成后看结果是否符合基本要求,如果符合则commit,不符合rollback.

【进行转账A给B 100,

客户端1:

update account set balance=balance-100 where aaccount_name='A';--抢到A的锁
update account set balance=balance+100 where aaccount_name='B';--抢到B的锁

select *from account; --看账户是否大于0,大于0则commit

死锁

互斥,循环等待,不可剥夺,请求保持

客户端1:

update account set balance=balance-100 where aaccount_name='A';--抢到A的锁
update account set balance=balance+100 where aaccount_name='B';--等B的锁

客户端2:

update account set balance=balance-100 where aaccount_name='B';--抢到B的锁
update account set balance=balance-100 where aaccount_name='A';--等A的锁

oracle用有限等待打破死锁

数据库的设计

三范式,理论模型

第一范式:字段设计要不可再分,单表的设计

第二范式:多张表中,只存关系,不存具体信息

第三范式:两张表的关系在第三张表中体现

【在实际开发中,个人信息可能有十几个字段,但登录时只会用到几个字段信息,为了性能可以分成两个表】

第四范式:数据库设计依赖于实际

递归表,树形表

数据库的序列,同义词,事务,数据库的设计_第1张图片
数据库的序列,同义词,事务,数据库的设计_第2张图片
id name tid(父节点) pid(属于什么类型)
1 家用电器
2 办公 p1
3 电脑 p2
4 手机 p3
5 运行商 p3
6 数码 p3
7 手机通信 p3 7
8 运行商 p3 8
9 摄影摄像 p3 9
10 手机 7 10
11 合约机 8 11
12 数码相机 9 12

当要选择家用电器下的,显示出手机/运营商/数码,应该找到

---创表
create table jd(
jid int primary key,
name varchar2(20),
tid varchar2(3),
pid varchar2(3));

---插入数据
insert into jd values (1,'家用电器',NULL,NULL);
insert into jd values(4,'手机',NULL,'p3');
insert into jd values(5,'运营商',NULL,'p3');
insert into jd values(6,'数码',NULL,'p3');
insert into jd values(7,'手机通信','p3','7');

--代码块
declare
cursor mycur is select name from jd where pid='p3';
tmp varchar2(20);
begin
open mycur;
loop
fetch mycur into tmp;
exit when mycur%notfound;
dbms_output.put(tmp||'/');

end loop;
DBMS_OUTPUT.NEW_LINE;
close mycur;
end;
权限表

用户表

用户权限表

权限表

权限角色表

角色表(某种角色有一堆权限)(connect,resource)

用户角色表

用户表  
uuid name
1 jack
2 rose
3 peter
权限表  
pid name
1 create session
2 create table 
3 create user
角色表  
rid name
1 connect
2 resource
3 sysdba
用户权限表  n-m
uuid pid
1 1
1 2
2 1
3 1
权限角色表 n-m
pid rid
1 1
1 2
2 1
2t 2
用户角色表 n-m
uuid rid
1 1
2 2
2 1
3 1

查询Jack的权限

--用户表
create table tuser(
uuid int primary key,
name varchar2(10));
--权限表
create table tp(
pid int primary key,
name varchar2(20));
--角色表
create table trole(
rid int primary key,
name varchar2(10));
--用户权限表
create table tu_p(
uuid int ,
pid int
);
--权限角色表
create table tp_r(
pid int ,
rid int
);
--用户角色表
create table tu_r(
uuid int ,
rid int
);
--插数据
insert into TUSER values(1,'jack');
insert into TUSER values(2,'rose');
insert into TUSER values(3,'peter');

insert into Tp values(1,'create session');
insert into Tp values(2,'create table');
insert into Tp values(3,'create user');

insert into trole values(1,'connect');
insert into trole values(2,'resource');
insert into trole values(3,'sysdba');

insert into tu_p values(1,2);
insert into tu_p values(1,1);
insert into tu_p values(2,1);
insert into tu_p values(3,1);

insert into tp_r values(1,2);
insert into tp_r values(1,1);
insert into tp_r values(2,1);


insert into tu_r values(2,2);
insert into tu_r values(1,1);
insert into tu_r values(2,1);
insert into tu_r values(3,1);
--通过用户权限表查询
select * from tuser t1 
join tu_p t2 on t1.uuid=t2.uuid
join tp t3 on t2.pid=t3.pid 
where t1.name='jack';
--通过用户角色
select * from tuser t1 
join tu_r t2 on t1.uuid=t2.uuid
join tp_r t3 on t2.rid=t3.rid 
join tp t4 on t4.pid=t3.pid 
where t1.name='jack';

E-R图

一对多,多对一,多对多

练习

数据库的序列,同义词,事务,数据库的设计_第3张图片

数据库的序列,同义词,事务,数据库的设计_第4张图片

当在设计表时,可以从使用场景来分,每辆车开始时都会填信息表,在运行时填运行状态表,维修人员填维修表

小车基本信息

id (车的唯一标识) len(轨道长度) inductor_loc_1(感光板一的位置) inductor_loc_2(感光板二的位置) laser_loc_1(减速器位置) laser_loc_2 create_time
1 10 0 10 1 9
2 15 0 13 1 12

小车维修表

oid(操作记录的主键) id operator(操作人员) case(出现故障的原因) create_time

小车运行表

lid id status create_time
故障的数据字典
E001 未正常降速
E002 预警灯坏了
E003 轨道故障

其中如果想要id号唯一可以时间戳+设备ID+序列号,数据字典则是可以规范填表,做好统计。

--建表
create table car_in(
id int primary key,
len number(10,2),
inductor_loc_1 number(10,2),
inductor_loc_2 number(10,2),
laser_loc_1 number(10,2),
laser_loc_2 number(10,2),
create_time timestamp
);

create table run(
lid varchar2(100) primary key,
id int,
status int,
create_time timestamp
);

create table oprate(
oid varchar2(100) primary key,
id int,
operate int,
casec varchar2(10),
create_time timestamp
);

SELECT * FROM oprate;

insert into car_in values('1'	,'10'	,'0',	'10',	'1',	'9',sysdate-420);
insert into car_in values(2	,15,	0	,13	,1	,12,sysdate-1842);
insert into car_in values(3,15,0,15,2,13,sysdate-1122);

insert into run values(sysdate||'-'||1||1,1,0,sysdate);
insert into run values(sysdate-20||'-'||1||2,1,2,sysdate-20);

insert into oprate values(sysdate||'-'||'1-'||1,1,7655,'E001',sysdate);
insert into oprate values(to_char(sysdate)||'-'||'1-'||2,1,7655,'E002',sysdate);

你可能感兴趣的:(数据库,sql,oracle)