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

发布时间:2024年01月18日

序列

用于数值类型的主键

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用有限等待打破死锁

数据库的设计

三范式,理论模型

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

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

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

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

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

递归表,树形表

idnametid(父节点)pid(属于什么类型)
1家用电器
2办公p1
3电脑p2
4手机p3
5运行商p3
6数码p3
7手机通信p37
8运行商p38
9摄影摄像p39
10手机710
11合约机811
12数码相机912

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

---创表
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)

用户角色表

用户表 
uuidname
1jack
2rose
3peter
权限表 
pidname
1create session
2create table?
3create user
角色表 
ridname
1connect
2resource
3sysdba
用户权限表? n-m
uuidpid
11
12
21
31
权限角色表 n-m
pidrid
11
12
21
2t2
用户角色表 n-m
uuidrid
11
22
21
31

查询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图

一对多,多对一,多对多

练习

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

小车基本信息

id (车的唯一标识)len(轨道长度)inductor_loc_1(感光板一的位置)inductor_loc_2(感光板二的位置)laser_loc_1(减速器位置)laser_loc_2create_time
11001019
215013112

小车维修表

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

小车运行表

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

文章来源:https://blog.csdn.net/qq_51564866/article/details/135592721
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。