PostgreSQL整体结构理解

784 阅读3分钟

一、逻辑结构

img

二、表空间

1. 概念

postgres中,表空间允许在文件系统中定义数据库对象存储的位置,也就是指定了一个目录。一个表空间可以让多个数据库使用,一个数据库也可以使用多个表空间,属于”多对多“的关系。

2. 主要应用场景

  • 存储磁盘没有空间时,可以使用表空间把数据存储到其他的地方;
  • 优化性能,如频繁使用的数据表或者索引放在高性能的硬盘上,而较少使用的放在普通硬盘上。

3. 初始表空间

postgres自带了两个表空间:

  • pg_default:用来存储系统目录对象、用户表、用户表index、和临时表、临时表index、内部临时表的默认空间;

  • pg_global: 用来存放系统字典表。

4. 相关语句

查询已经存在的表空间:

SELECT * FROM PG_TABLESPACE;

创建表空间,所有者postgres,表空间名称tsp01,存放目录F:\test\要保证文件夹存在且为空:

CREATE TABLESPACE tsp01 OWNER postgres LOCATION 'F:\test\';

给数据库普通用户授予表空间上权限:

GRANT CREATE ON TABLESPACE tsp01 TO user;
-- 在表空间上创建表
CREATE TABLE test(id int) TABLESPACE tsp01;

给数据库指定表空间:

ALTER DATABASE database_name SET TABLESPACE new_tablespace_name;

移动表所属表空间:

ALTER TABLE table_name SET TABLESPACE new_tablespace_name;

删除表空间:

DROP TABLESPACE IF EXISTS tablespace_name;

三、模式(Schema)

1. 概念

一个数据库包含一个或多个已命名的模式,模式又包含表。模式还可以包含其它对象, 包括数据类型函数操作符 等。同一个对象名可以在不同的模式里使用而不会导致冲突; 和数据库不同,模式不是严格分离的:只要有权限,一个用户可以访问他所连接的数据库中的任意模式中的对象。但是,模式不可以嵌套。

2. 使用模式的优点:

  • 允许多个用户使用一个数据库而不会干扰其它用户。
  • 把数据库对象组织成逻辑组,让它们更便于管理。
  • 第三方的应用可以放在不同的模式中,这样它们就不会和其它对象的名字冲突。

3. 相关语句

创建模式:

create schema myschema;

删除为空的模式:

DROP SCHEMA myschema;

删除模式以及其包含的所有对象:

DROP SCHEMA myschema CASCADE;

四、表空间、数据库、模式、表、用户、角色之间的关系

1. 角色和用户关系

角色和用户在postgresql中是完全相同的两个对象,唯一的区别是在创建的时候,用户默认有LOGIN的权限而角色没有。

角色、用户创建语句:

CREATE ROLE role_name PASSWORD 'psw';
ALTER ROLE role_name LOGIN; -- 为角色赋权 登录
-- 创建用户
CREATE USER user_name PASSWORD 'psw';

2. 数据库与模式关系

模式是对数据库的逻辑分隔,在创建数据库的时候PostgreSQL会默认创建一个模式 Public,所有为此数据库创建的对象(表、函数、试图、索引、序列等)都是创建在这个模式中的。

创建模式:

CREATE SCHEMA schema_name;
ALTER SCHEMA schema_name OWNER TO user_name; -- 赋权

在模式下创建表:

CREATE TABLE schema_name.test (uuid integer not null);

操作模式下表:

insert into new_schema.test (uuid) values ('100001');
commit;
select * from new_schema.test;

3. 表空间与数据库关系

一个表空间可以让多个数据库使用,一个数据库也可以使用多个表空间,属于”多对多“的关系。详情见第二节表空间。

五、总结

表空间是磁盘上的一个文件夹,在这个文件夹中可以存储多个数据库。在数据库中,创建是会先创建一个默认的模式,之后又在模式中创建表等对象并将不同的模式指派给了不同的角色,可以实现权限分离,也可以通过授权实现模式间的对象的共享。