暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一文带你看懂PostgreSQL逻辑架构,附:与Oracle/MySQL的关键对比

PostgreSQL的逻辑结构



PostgreSQL的逻辑结构采用层级式设计,从高到低依次为:数据库集群 → 数据库(Database) → 模式(Schema) → 数据库对象(表/视图/函数等),其中多个数据库可以共享同一实例但它们之间相互隔离,模式作为命名空间管理对象,用户和角色全局统一管理权限。


数据库(Database)是管理数据库对象的顶层级别,关于数据库,有如下注意事项:

  • 一个PostgreSQL实例中,可以包含一个或多个数据库,但是一个数据库只能属于一个实例。

  • 连接PostgreSQL时,必须指定具体数据库,一个连接不能同时连接到多个数据库,但是一个客户端可以打开连接不同数据库的多个连接。

  • 不同数据库之间相互独立,连接到某个数据库时,无法访问其他数据库中的对象(除非使用dblink等其他手段)。


模式(Schema)可以理解为一个命名空间,类似于操作系统中目录的概念,但模式之间不能嵌套(操作系统中的目录可以嵌套)。关于模式,有如下注意事项:

  • 一个数据库中,可以包含一个或多个模式,但是一个模式只能属于一个数据库。

  • 数据库中的数据库对象(Table、Index、View、Sequence、Function等)必须且仅隶属于一个模式。

  • 隶属于同一个模式的数据库对象之间不允许重名,隶属于不同模式的数据库对象之间允许重名。


在SQL标准中,用户(User)和角色(Role)共同构成了数据库权限管理系统的基础。用户是拥有数据库对象并具有数据库权限的实体,而角色是一组权限的合集,是用户组的抽象表示。为了管理方便,通常把一系列相关的数据库权限赋给一个角色,如果哪个用户需要这些权限,就把角色赋给相应的用户。

在PostgreSQL中,使用角色的概念来管理数据库访问权限,关于用户和角色有如下注意事项:

  • 可以认为用户和角色在PostgreSQL是同一个概念,唯一的差别是创建角色默认不具有登录权限,而用户默认具有登录权限,并且用户和角色都可以在创建后修改登录权限。为了方便说明,下面我们都使用“用户”来代指用户和角色两个概念。

  • 用户在PostgreSQL实例中是属于全局的,并不属于具体某一个数据库,在同一实例连接不同数据库时,看到的用户列表是相同的。

  • 可以通过继承(授予)的方式,把一个用户的权限赋予另一个用户。



与Oracle/MySQL的对比


在Oracle和MySQL中,逻辑结构与PG有一些差异。例如在Oracle中用户与模式严格绑定,淡化了模式的概念;在MySQL中采用了扁平化的层级设计,数据库即是命名空间(模式)。

关于PostgreSQL、Oracle和MySQL三种数据库中逻辑架构,可以用下图概括:



以下是三类数据库中关于逻辑架构的差异点总结:


文章转载自张家辉的DB演武场,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论