前面文章介绍了PostgreSQL的体系结构,今天对PostgreSQL对象的逻辑结构关系做一下整理。这里说的逻辑结构将横跨PostgreSQL体系结构中的内存结构及存储结构,关于体系结构的介绍,可以查看上一篇文章:
从Oracle到PG-PostgreSQL数据库体系结构概述
下面通过结构图对比一下Oracle和PostgreSQL的逻辑结构关系。
首先,是Oracle DBA比较熟悉的逻辑结构图:
Oracle逻辑结构图
参照Oracle的逻辑结构图,我这里画一张PostgreSQL的逻辑结构做对比:
PostgreSQL逻辑结构图
pg中对象的逻辑结构关系可以描述为下面的“绝对路径”:
db_cluster.tablespace.database01.schema01.table|index|function...;
复制
注意:这里的db cluster并非普通意义上的集群,PostgreSQL中的database cluster翻译理解为“集簇”更适合,在层级上对标Oracle 12C实例。
为了避免混淆,这里暂时把pg的cluster理解为数据库实例吧:
sid.tablespace.database01.schema01.table|index|function...;
复制
从上面的“绝对路径”可以看出:
1.一个pg实例(集簇)可以有多个tablespace;
2.一个tablespace可以包含多个database;
3.一个database可以包含多个schema;
4.一个schema可以包含多个表、索引等。
注意:这里的说的“绝对路径”,Pg的SQL并非真的可以这样写,只是为了便于理解而已,下面这种写法是不支持的:
select * from sid.tablespace.database01.schema01.table01;
复制
正确的写法是缩减到schema级别,即和Oracle的schema.object对应:
\c database01 --先切换到schema所在的database下
select * schema01.table01;
复制
schema在PostgreSQL里面实际上指的是命名空间的意思,表和索引都在schema下命名。
而tablespace和database则对应到操作系统的具体的实体目录,里面存放的是schema里对象的数据文件。如下:
[postgres@akendb01]$cd $PGDATA/base/13286
[postgres@akendb01]$pwd
/aken/data/pgsql/1105/data/base/13286
[postgres@akendb01]$ls -l 1247*
-rw------- 1 postgres postgres 73728 Aug 26 21:28 1247
-rw------- 1 postgres postgres 24576 Aug 26 21:28 1247_fsm
-rw------- 1 postgres postgres 8192 Aug 26 21:28 1247_vm
[postgres@akendb01]$
复制
上面的$PGDATA代表pg的实例集簇,base是pg的默认表空间目录,13286代表的是oid=13286这个database的目录,1247代表oid=1247这个表的相关数据文件。
同时,从上面可以看到,PostgreSQL的schema和Oracle的tablespace一样,是完全的逻辑概念,不存在实体目录文件。pg的物理文件的目录结构图如下:
图片引用自:http://www.interdb.jp/pg/pgsql01.html
本文大概介绍了PostgreSQL对象的逻辑结构关系,关于PostgreSQL中的物理文件的目录结构,后续文章介绍。