什么是“对象”?

Mar*_*ery 2 postgresql terminology

Postgres 文档经常使用术语“对象”。例如,https://www.postgresql.org/docs/current/app-psql.html 上的各种\d命令的描述(例如用于列出表或用于列出聚合函数)使用如下短语:\dt\da

默认情况下,只显示用户创建的对象;提供模式或S修饰符以包含系统对象。

由此,我可以推断出,至少每个命令列出的特定内容——比如聚合函数、表、字符集编码、模式和一大堆其他东西——是 Postgres 命名法中的“对象”。考虑到在它们的描述中避免使用“对象”这个词,我还可以合理地猜测一些可以用\d命令列出的东西,比如角色,不是对象。

但这究竟是什么意思?目前我无法判断任何特定的东西(如表格行、表格列或角色)是否被正确地视为“对象”,除非发生在 Postgres 文档中的某个位置如此称呼。文档使用的基本定义是什么?

Dan*_*ité 5

考虑到在它们的描述中已经避免使用“对象”这个词,我还可以合理地猜测一些可以用 \d 命令列出的东西,比如角色,不是对象。

不,因为角色在文档的某些部分也被称为对象。例如: https : //www.postgresql.org/docs/current/catalog-pg-shdepend.html

目录 pg_shdepend 记录了数据库对象和共享对象(如角色)之间的依赖关系。此信息允许 PostgreSQL 在尝试删除它们之前确保这些对象未被引用。

共享在跨数据库共享此上下文中的装置)。

我建议作为基准,Postgres 中必须具有 OID 的所有内容都可以被限定为对象,而所有没有 OID 的内容可能都不是对象。最重要的是,可能存在一些例外情况:例如,尽管数据库具有 OID,但可能会争论一个数据库是否可以称为“对象”,这取决于上下文。

oid是部分系统列。它曾经出现在每个表甚至每一行的旧版本中,但这种用法已被弃用。这种弃用是一个持续的过程:下一版本的 Postgres 会将oid目录中的列转换为普通列。

就像 的使用在oid进化一样,可以被定义为对象的东西也在进化,因为几乎每个新版本中都会向 Postgres 添加新类型的对象,这与缺乏正式定义是一致的。