概念
本文讨论所说的都是 PostgreSQL 数据库的相关定义内容,其中名词以及翻译如下:
数据库:database
模式:schema
表:table
表空间:tablespace
用户:use
用户角色:role
数据库(database)
PostgreSQL 通用的语法:
database.schema.table
在 PostgreSQL 数据库中,数据库(database)可以认为是物理层面数据集合。当使用不同的文字编码/排序规则等管理数据对象时,不同的文字编码规则/排序规则要创建独立的的数据库。PostgreSQL 关于文字编码/排序规则等行为的默认规则是以database为单位的。当需要对一组数据库表(或函数等)的并发数进行单独控制时,需要对这些表(或函数等)放入一个新建的 database 中,PostgreSQL 对最大并发访问会话进行单独控制的最小单元是 database。
当需要对一组数据库表(或函数等数据库对象)的访问进行严格隔离时(不仅仅是通过 SQL 层面的 priviledge 来控制),在 PostgreSQL 中, 对于 Access 的控制,除了 SQL 级别的权限控制之外,可以在 pg_hba.conf 配置文件中进行会话级别的认证控制。
会话级别的高精度访问控制可做到:
【1】会话来源(IP地址);
【2】会话所使用的数据库用户;
【3】会话连接目标的Database名
模式(schema)
模式是数据库中的一个概念,可以将其理解为一个命名空间或目录,不同的模式下可以有相同名称的表、函数等对象而不会产生冲突。如果没有模式的概念,那么不同用户或者开发者在创建各自数据库对象命名时可能会发生冲突以及相互干扰等问题,有了模式,就可以避免这些问题。模式的好处如下:
- 允许多个用户使用同一个数据库且用户之间不会互相干扰
- 把数据库对象放在不同的模式下组织成逻辑组,使数据库对象更加便于管理
- 第三方应用可以放在不同的模式中,这样就不会和其他对象的名字产生冲突了
一个数据库包含一个或者多个模式,模式中又包含了表、函数以及操作符等数据库对象。其中的层级关系是:数据库-模式-对象。需要注意的是,虽然能创建多个数据库实例,但不能同时访问不同数据库中的对象,当需要访问另一个数据库中的表或其他对象时,需要重新连接到这个数据库,而模式却没有此限制,一个用户在连接到一个数据库后,就可以同时访问这个数据库中多个模式的对象。
表空间(tablespace)
不同的数据库表空间有不同的定义。在 PostgreSQL 中,表空间允许在文件系统中定义数据库对象存储的位置,实质上就是指定一个目录。
应用场景:
- 存储磁盘没有空间时,可以使用表空间把数据存在其它地方;
- 利用表空间对数据库进行性能优化。常用来将频繁使用的数据表或者索引放在高性能的硬盘上,而较少使用的放在普通硬盘上。
自带表空间:
pg_default
:用来存储系统目录对象,用户表、用户表index、临时表、临时表index、内部临时表的默认空间。pg_global
:用来存储系统字典表。
pg_tblspc 存储手动创建表空间的软连接信息。初始是空的,当手动增加表空间时,该目录下会自动生成一个软连接,指向表空间设定的路径。
一个表空间可以让多个数据库使用,而一个数据库可以使用多个表空间,属于“多对多”的关系。注意:Oracle 中一个表空间只属于一个数据库,而一个数据库可以使用多个表空间,属于“一对多”的关系。
用户(user)和 角色(role)
在 PostgreSQL中,存在两个容易混淆的概念:角色/用户。之所以说这两个概念容易混淆,是因为对于PostgreSQL来说,这是完全相同的两个对象。唯一的区别是在创建的时候:
-
我用下面的psql创建了角色kanon:
CREATE ROLE kanon PASSWORD ‘kanon’;
接着我使用新创建的角色kanon登录,PostgreSQL给出拒绝信息:
FATAL: role ‘kanon’ is not permitted to log in.
说明该角色没有登录权限,系统拒绝其登录。 -
我又使用下面的psql创建了用户kanon2:
CREATE USER kanon PASSWORD ‘kanon2’;
接着我使用kanon2登录,登录成功。
难道这两者有区别吗?查看文档,又这么一段说明:“CREATE USER is the same as CREATE ROLE except that it implies LOGIN.”----CREATE USER 除了默认具有 LOGIN 权限之外,其他与 CREATE ROLE 是完全相同的。
为了验证这句话,修改 kanon 的权限,增加 LOGIN 权限:ALTER ROLE kanon LOGIN;再次用kanon登录,成功!
那么,事情就明了了:CREATE ROLE kanon PASSWORD ‘kanon’ LOGIN 等同于 CREATE USER kanon PASSWORD ‘kanon’.
这就是 ROLE/USER 的区别。