PGSQL PUBLIC Schema?

分类: 编码创建于: 6/2/2025

在 PostgreSQL 中,public 并不是一种“模式”或表的属性,而是数据库中的一个默认 schema(模式) 的名称。让我详细解释一下这个概念及其在数据库管理软件中的显示。

什么是 public schema?

  • 在 PostgreSQL 中,schema 是一种逻辑分组机制,用于组织数据库中的对象(如表、视图、函数等)。你可以把 schema 想象成一个命名空间,用来避免对象名称冲突,并对权限进行更细粒度的控制。
  • public 是 PostgreSQL 数据库中默认创建的一个 schema。任何新创建的表、视图等,如果在创建时没有显式指定 schema,都会默认放在 public schema 中。
  • 换句话说,public 是一个“容器”,你的表被放在这个容器里。当你在数据库管理软件(如 pgAdmin、DBeaver 等)中看到某张表显示为 public.<table_name>,表示这张表属于 public schema。

为什么会有 public schema?

  • public schema 的存在是为了方便用户快速开始使用数据库,而不需要手动创建和管理 schema。
  • 默认情况下,新创建的用户对 public schema 具有 USAGE 权限,并且可以创建对象(除非管理员修改了权限设置)。
  • 在小型项目或个人使用中,通常直接使用 public schema 就足够了。但在大规模项目中,可能会创建多个 schema 来分离不同的模块或团队的数据。

在数据库管理软件中看到 public 的含义

  • 当你使用数据库管理软件时,看到某张表显示为 public.<table_name>(例如 public.users),这只是告诉你该表位于 public schema 中。
  • 如果你在创建表时没有指定 schema,例如:
    1CREATE TABLE users (
    2    id BIGSERIAL PRIMARY KEY,
    3    username VARCHAR(50) NOT NULL
    4);
    则该表会默认创建在 public schema 中,等同于:
    1CREATE TABLE public.users (
    2    id BIGSERIAL PRIMARY KEY,
    3    username VARCHAR(50) NOT NULL
    4);

如何确认表所在的 schema?

你可以通过以下 SQL 查询确认某张表所在的 schema:

1SELECT table_schema, table_name
2FROM information_schema.tables
3WHERE table_name = 'your_table_name';

这会返回该表的 table_schema 列,如果显示为 public,则表在 public schema 中。

是否需要使用其他 schema?

  • 如果你的项目规模较小,使用 public schema 没有任何问题。
  • 如果项目复杂,或者需要分离不同模块的数据和权限,可以创建自定义 schema,例如:
    1CREATE SCHEMA my_app;
    2CREATE TABLE my_app.users (
    3    id BIGSERIAL PRIMARY KEY,
    4    username VARCHAR(50) NOT NULL
    5);
  • 你还可以通过设置搜索路径(search path)来简化查询,避免每次都指定 schema:
    1SET search_path TO my_app, public;
    这样,数据库会优先在 my_app schema 中查找对象,如果找不到再去 public schema。

权限相关注意事项

  • 默认情况下,public schema 对所有用户开放(具有 USAGE 权限),并且新用户可以在其中创建对象。如果你的项目对安全性要求较高,可以通过以下命令撤销这些默认权限:
    1REVOKE CREATE ON SCHEMA public FROM PUBLIC;
    2REVOKE USAGE ON SCHEMA public FROM PUBLIC;
  • 然后,根据需要为特定用户或角色分配权限。

总结

在 PostgreSQL 中,public 是一个默认的 schema,用于存放未指定 schema 的表和对象。当你在数据库管理软件中看到某张表标记为 public,这只是表示该表位于默认的 public schema 中,而非某种特殊模式或属性。如果你不需要复杂的 schema 管理,继续使用 public 是完全可以的;如果需要更高的组织性和安全性,可以考虑创建自定义 schema。

如果你有其他关于 schema 或 PostgreSQL 管理的问题,或者有具体场景需要进一步解释,请随时告诉我!