PostgreSQL 和默认模式

jfr*_*k53 9 schema postgresql

每当我在 PostgreSQL Maestro 中创建一个全新的数据库时,它都会创建以下默认模式列表:

在此处输入图片说明

现在根据我的理解,模式就像组织文件夹等。所以我的问题是当我创建新数据库时是否需要所有这些模式?如果是这样,它们在 PG 方面用于什么,因为我自己永远不会使用它们。

我可以理解,information_schema因为这是在服务器上安装 MySQL 的默认设置,尽管我不明白为什么数据库需要它自己而不是整个服务器,但我猜每个数据库类型都有他自己的。

Mik*_*ll' 11

您所看到的主要是一种显示 PostgreSQL 数据库结构的用户界面方式。

如果您使用 pgAdminIII,它只是另一个管理界面,每个数据库通常会显示两个“目录”:information_schema 和 pg_catalog。它还有一个名为“public”的模式。

名为“pg_*”的数据库对象是系统对象。pg_toast 模式保存大表的 TOAST 存储。

information_schema 视图是 SQL 标准的一部分。它们应该提供一种独立于供应商的方法来确定存储在供应商特定系统表中的信息。

您可以很好地说明不要将每个命名空间都当作用户级架构来公开。(在内部,这些是命名空间。试试看select * from pg_namespace;。)新创建的数据库中唯一对用户真正重要的模式是“公共”。


Erw*_*ter 7

如果您保留默认值search_path并使用默认模式public(自动),则根本不必理会模式。

但是,如果您的数据库增长,您很可能会很高兴地使用它们来组织对象和权限。通过设置search_path每个用户/数据库/会话/...,您可以以任何方式管理架构优先级。我在 SO 上的这个相关答案中收集了几种方法来做到这一点

模式很像文件系统中的目录:
如果您没有对对象名称 ( myschema.mytable) 进行模式限定,search_path则在创建对象时会假定您的第一个模式。这就像文件系统中的“当前目录”。

使用对象search_path时,将依次搜索 中的所有模式。就像文件系统中的搜索路径一样。

但是:
没有“根模式”,也没有嵌套。你不能“没有模式”存储任何东西。每个对象都是在特定模式中创建的。(数据库集群级别的特殊对象除外,如角色和数据库。)

当前角色需要访问架构的权限。如果您想要组织事物并且仍然能够在简单查询中访问其他“区域”,则模式非常有用。

MySQL 没有类似的东西。对于在 PostgreSQL 中使用单独模式解决的许多问题,您将使用单独的数据库。