1. 数据库
一般意义上的数据库包含两个部分
- 库:就是一个存储一堆文件的文件目录
- 数据库管理系统:管理库的系统
2. DBMS 数据库管理系统
数据库管理系统(Database Management System),是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS
;
它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性;
用户通过DBMS
访问数据库中的数据,数据库管理员通过DBMS
进行数据库的维护工作;
它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库;
大部分DBMS
提供
- 数据定义语言
DDL(Data Definition Language)
:定义表、存储过程等。 - 数据操作语言
DML(Data Manipulation Language)
:定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。 - 数据库控制语言
DCL(Data Control Language)
:设置或更改数据库用户或角色权限的语句是一个操纵和管理数据库的大型软件,对数据库进行统一的管理。
3. Oracle 数据库
数据库有很多种,Oracle是其中之一,且是一个大型数据库,可以处理存储、处理海量数据,是大公司/企业常用数据库,价格相对高昂。
先看Oracle
中的逻辑概念:
- 数据库:
物理意义上的库,数据的物理存储,包括【数据文件ORA或者DBF、控制文件、联机日志、参数文件】
Oracle
数据库中物理库的概念和其它数据库不一样,一个操作系统只有一个物理库,可以看作是Oracle
就只会有一个总数据库,其他都是逻辑数据库; - 数据库实例:
数据库启动时初始化的一组进程和内存结构,用来操作对应的数据库,一个实例只能对应一个数据库,但一个数据库可以对应多个实例; - 表空间:
是一个用来管理数据存储的逻辑概念;
表空间只是和数据文件(ORA或者DBF文件)发生关系,数据文件是物理意义上的,一个表空间可以包含多个数据文件,而一个数据文件只能隶属一个表空间; - 用户:
用户是在实例下建立的,不同实例可以建相同名字的用户;
Oracle数据库建好后,要想在数据库里建表,必须先建立用户,并为用户指定表空间,然后在创建表的时候指定存放在表空间;
Oracle就是通过用户这个概念来实现多个逻辑数据库的; - 表:
有了数据库、表空间和用户,就可以基于某一个用户在自己的表空间中创建表了;
有了表就可以存储数据了; - 数据文件:
数据库的物理存储单位;
数据库的数据是存储在表空间中一个或者多个数据文件中;
一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间;
一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只有删除其所属的表空间才行;
这里的段就是表
注意:
表的数据,是基于某一个用户放入某一个表空间的,而这个表空间会随机把这些表数据放到一个或者多个数据文件中;
Oracle
的数据库是逻辑概念上的,是由用户和表空间对数据进行管理和存放的;
但是表不是由表空间去查询的,而是由用户去查的,因为不同用户可以在同一个表空间建立同一个名字的表,所以说实际上区分逻辑数据库的是用户。
3.1 创建表空间、用户
Oracle
安装完成后,自带一个内置的客户端sqlplus
通过sqlplus
客户端创建表空间:
- 启动sqlplus,但是不登录
sqlplus /nolog;
- 通过超级管理员以dba的身份登录
conn sys/root as sysdba;
- 创建表空间
create tablespace 表空间名 datafile '文件路径\文件名.dbf' size 空间大小;
- 创建用户并指定表空间
create user 用户名 identified by 密码 default tablespace 表空间名;
- 给用户授予dba权限
grant dba to 用户名;
dba
拥有所有权限,也可以单独授予用户连接、删除等单独权限。
3.2 约束
在数据库中我们通过约束来对每个字段中的数据的合法性进行规范
Oracle
中常见约束:
- 主键约束(PRIMARY KEY)
- 唯一约束(UNIQUE)
- 非空约束(NOT NULL)
- 外键约束(FOREIGN KEY)
- 检查约束(CHECK)
3.2.1 主键约束
主键是定位表中单个行的方式,可 唯一确定 表中的某一行;
关系型数据库要求所有表都应该有主键;
不过Oracle
没有遵循此范例要求,Oracle中的表可以没有主键(这种情况不多见);
关于主键有几个需要注意的点:
- 主键列必须必须具有 唯一性,且 不能为空,其实
主键约束
相当于UNIQUE+NOT NULL
; - 一个表只允许有一个主键;
- 主键所在列必须具有索引(主键的唯一约束通过索引来实现),如果不存在,将会在索引添加的时候自动创建;
3.2.2 唯一约束
唯一性约束可作用在单列或多列上,对于这些列或列组合,唯一性约束保证每一行的唯一性; UNIQUE
允许null
值,UNIQUE
约束的列可存在多个null
;
3.2.3 非空约束
约束列数据不能为空;
3.2.4 外键约束
外键约束是关系数据库中的一种约束,用于维护表之间的关系。它定义了一个表的列与另一个表的主键或唯一键之间的关系。在Oracle数据库中,外键约束有以下特点:
-
外键关系:外键约束用于确保两个表之间的关系。在外键约束中,一个表的列(称为外键)引用了另一个表的主键或唯一键(称为参考键);
-
参考完整性:外键约束确保了参考完整性,即外键的值必须在参考表中存在。这样可以防止在关联表之间出现不一致的数据;
-
级联操作:外键约束还可以定义级联操作,以确保在主表中的更新或删除操作时,相关的外键表也会相应进行更新或删除。常见的级联操作包括级联更新(CASCADE UPDATE)和级联删除(CASCADE DELETE);
-
约束类型:在Oracle中,外键约束可以是唯一约束(UNIQUE CONSTRAINT)或主键约束(PRIMARY KEY CONSTRAINT)的一部分。也可以单独定义外键约束;
-
创建外键约束:可以使用ALTER TABLE语句来创建外键约束。例如,以下示例创建了一个名为fk_order_customer的外键约束,将order表的customer_id列与customer表的id列关联起来:
ALTER TABLE order ADD CONSTRAINT fk_order_customer FOREIGN KEY (customer_id) REFERENCES customer (id);
-
禁用和启用外键约束:可以使用ALTER TABLE语句来禁用或启用外键约束。例如,以下示例禁用了名为fk_order_customer的外键约束:
ALTER TABLE order DISABLE CONSTRAINT fk_order_customer;
这将禁用外键约束,使得可以在不违反外键约束的情况下修改或删除相关的数据。类似地,可以使用ENABLE CONSTRAINT语句来启用外键约束;
3.3 图形化客户端
一般Oracle
数据库不用自带的sqlplus
客户端操作数据,只用作用户、表空间等基础数据的操作和管理,因为全是命令行不方便,操作表、存储过程等数据常用图形客户端,例如sqldeveloper
、plsqldeveloper
等
Oracle数据查询数据流程
Oracle的DBMS查询数据的大体流程如下:
-
用户发起查询请求:用户通过SQL语句向Oracle数据库发起查询请求。SQL语句可以包括查询条件、排序规则、分组规则等。
-
SQL解析:Oracle数据库接收到查询请求后,会对SQL语句进行解析。解析过程包括语法检查、语义检查和权限检查等。
-
查询优化:在解析完SQL语句后,Oracle数据库会对查询语句进行优化。优化过程包括选择最优的执行计划、选择合适的索引、重写查询语句等。
-
执行查询计划:一旦查询计划确定,Oracle数据库会根据查询计划执行查询操作。查询操作包括扫描表、使用索引、聚合数据、连接表等。
-
返回结果集:当查询操作完成后,Oracle数据库会将查询结果返回给用户。结果可以是单个值、一行或多行数据,也可以是查询的统计信息。
-
结果处理:用户接收到查询结果后,可以对结果进行进一步处理。处理方式可以是保存结果、打印结果、导出结果等。
其中 执行查询计划 的过程中,Oracle数据库会将需要的数据从磁盘加载到内存中进行处理;这是为了提高查询的性能,因为内存的读取速度比磁盘要快得多;
具体来说,当执行查询计划时,Oracle数据库会使用缓冲区高速缓存(Buffer Cache)来存储已经读取的数据块;如果查询需要的数据块已经在缓冲区高速缓存中,则可以直接从内存中读取,避免了磁盘I/O的开销;如果查询需要的数据块不在缓冲区高速缓存中,则会从磁盘读取相应的数据块,并将其加载到缓冲区高速缓存中,供后续查询使用;
通过将数据加载到内存中,Oracle数据库可以减少磁盘I/O的次数,提高查询的响应速度和性能;同时,Oracle数据库还会使用其他技术如数据压缩、内存排序等来进一步优化查询操作;
其实其它与Oracle
一样都是关系型数据库的数据库如Mysql
都是类似的查询流程。这些传统的关系型数据库都受限于表结构、数据关联、磁盘IO、可靠性、强持久化等因素的影响。
拓展:非关系型数据
如上所说,传统关系型数据库有其局限性,因此非关系型数据就是突破这些局限性,迎合大数据时代的来临;当然,这样也会出现它自身的短板,例如持久化、可靠性等;
一般来说,NoSQL
数据库相对于传统的关系型数据库(如Oracle)在某些场景下可以 减少磁盘I/O开销。这是因为NoSQL数据库采用了不同的数据存储和访问模型;
NoSQL
数据库通常采用 键值存储、文档存储、列存储或图形存储 等非关系型数据模型,这些模型往往具有更高的可伸缩性和灵活性。在某些情况下,NoSQL数据库可以将数据完全存储在内存中,减少了对磁盘的访问需求,从而降低了磁盘I/O开销 。
此外,NoSQL数据库还采用了一些优化技术,如数据分片、数据复制、缓存等,以提高读写性能和降低磁盘I/O开销。例如,一些NoSQL数据库可以将数据分布在多个节点上,通过并行读取和写入操作来提高性能,并减少对单个节点的磁盘I/O压力。
然而,需要注意的是,NoSQL数据库并不是在所有场景下都比关系型数据库更少磁盘I/O开销。具体的性能表现还取决于具体的应用需求、数据模型、数据访问模式等因素。因此,在选择数据库时,需要综合考虑应用需求和数据库特性,进行合适的选择。