03:PostgreSQL逻辑结构(表空间、数据库、模式、表、索引)

news2025/1/16 5:43:29

环境规划:

  • 操作系统:CentOS 7.9 64bit
  • PostgreSQL 版本:16.x 或 15.x
  • 安装用户:postgres
  • 软件安装目标路径:/usr/pgsql-<version>
  • 数据库数据目录:/pgdata

目录

表空间Tablespace

  默认表空间

  手动创建的表空间

实例/Database/Schema/对象关系

数据库Database

  默认数据库

  手动创建的数据库

模式Schema

  默认Schema 

  模式搜索路径search_path

  删除public模式

  建议对template1中删除public模式

表Table 

  表创建、插入、删除

  表结构复刻

  临时表

  UNLOGGED表

索引Index 


本文假设已经掌握SQL基本语法和数据库基础概念。因此只简明扼要介绍PostgreSQL的逻辑结构。

表空间Tablespace

  默认表空间

数据库初始化之后自动会创建pg_default和pg_global两个表空间(pg_tablespace视图查看,也可以通过在psql中使用“\db+”查看)。

  • pg_default表空间:是用来存储系统目录对象、用户表、用户表index、和临时表、临时表index、内部临时表的默认空间。对应存储目录$PADATA/base/  (template0、template1和postgres数据库存放在pg_default表空间下)
  • pg_global表空间:用来存放系统字典表,共享系统目录;对应存储目录$PADATA/global/。相当于oracle数据库的system表空间

  手动创建的表空间

1、为表空间创建存放目录($PGDATA在本环境为/pgdata),在数据库服务器操作系统中以postgres用户执行:

mkdir -p $PGDATA/pg_tblspc/tbs_user1

 2、创建表空间。在psql中执行语句:

CREATE TABLESPACE tbs_user1 LOCATION  '/pgdata/pg_tblspc/tbs_user1';

创建tablespace的其他option选型,请参考官方文档。

实例/Database/Schema/对象关系

在PostgreSQL中,这几者之间关系为:

PG数据库服务(实例)

      └ database1

            └ schemaA

                   └ table_T1

                   └ table_T2

                   └ view_V1

            └ schemaB

      └ database2

            └ schemaA

            └ schemaB

      └ database3

            └ schemaA

            └ schemaB

PG数据库服务(实例)中可以有多个数据库(database),在psql工具中可以通过\c切换所连接的库。每个数据库下有不同的shema、每个schema下有不同的对象。

  • MySQL没有上图中数据库概念,只有上图的schema(在MySQL中schema也称为database,实际应为schema)
  • 在Oracle中,用户与Schema是绑定对应的,一个用户就是一个Schema。

数据库Database

  默认数据库

数据库初始化之后自动会创建postgres、template0、template1三个数据库。

  • postgres数据库:这是默认的管理数据库,用于管理 PostgreSQL 服务器和用户角色。它包含了用于管理服务器和用户的系统表,例如 pg_roles、pg_database 等。通常不建议用于存储实际数据,而仅用于管理目的。
  • template0数据库:这是一个空模板数据库,改模版非常“干净”,且不可修改。可用于创建其他数据库的模板。。
  • template1数据库:与 template0 类似,也是一个模板数据库,可用于创建其他数据库的模板。但与 template0 不同的是,template1 是可以被修改的,比如修改模版字符集、或者可以在其中创建用户自定义的对象,例如函数、表等。默认情况,我们新创建database会以template1库为模板进行创建。

  手动创建的数据库

在psql中执行语句:

--(不推荐)最简单创建
--其中:以执行语句的当前用户作为该库的owner,默认使用template1模板
CREATE DATABASE userdb;

--(推荐)指定其中该库的owner、模板、字符编码、表空间。
CREATE DATABASE userdb OWNER user_zyp TEMPLATE template0 ENCODING 'UTF8' TABLESPACE tbs_user1;

更多option选型,请参考官方文档。 

模式Schema

  默认Schema 

创建数据库时会自动会创建information_schema、pg_catalog、pg_toast、public四个模式。

手动创建的模式schema,在psql中(先连接至某个数据库)执行语句:

--(不推荐)最简单创建
--其中:以执行语句的当前用户作为该模式的owner
CREATE SCHEMA 模式名;

--(推荐)指定模式owner
CREATE SCHEMA 模式名 AUTHORIZATION 角色名/用户名;

--修改已有模式名
ALTER SCHEMA 模式名 RENAME TO 新模式名;

--修改已有模式的owner
ALTER SCHEMA 模式名 OWNER TO 角色名/用户名;

更多option选型,请参考官方文档。 

查看对象所属模式:

查看表所属模式
SELECT table_schema, table_name FROM information_schema.tables;

查看视图所属模式
SELECT table_schema, table_name FROM information_schema.views;

查看存储过程、函数所属模式
SELECT specific_schema, specific_name FROM information_schema.routines;

查看序列所属模式
SELECT sequence_schema, sequence_name FROM information_schema.sequences;

查看触发器所属模式
SELECT trigger_schema, trigger_name FROM information_schema.triggers;

  模式搜索路径search_path

由于存在多个模式,PostgreSQL提供了模式搜索路径(类似Linux中的PATH环境变量)来查找数据库中各对象。若语句中没有显示指定schema,则从search_path中存的模式列表中搜索:

  • 查找某个对象(表、视图、函数、索引等):则从search_path中左至右搜索,若在某模式下可找到对象,则以该模式下的对象作为选中对象。若遍历所有模式均未找到,则报不存在该对象Did not find any.......。
  • 若需要创建对象,则从search_path中左至右搜索,若某个模式存在且当前用户对该模式具有CREATE权限(Owner永远有创建权限),则以该模式作为新创建对象的所属模式。

查看和修改模式搜索路径search_path:

--查看
SHOW search_path;

--修改(当前会话级别)
SET search_path TO "$user", public;

--修改(数据库级别,重新连接生效)
ALTER DATABASE 数据库名 SET search_path TO "$user", public;

--修改(用户级别,重新登录后生效)
ALTER ROLE 角色名/用户名 SET search_path TO "$user", public;

search_path中:$user 表示模式名等于当前用户名,既仅在当前用户名与schema同名才能匹配上。

  删除public模式

PostgreSQL中每个database都默认存在public模式,而public不是SQL标准概念,在其他数据库软件中也不存在public模式。

因此,为了最大程度兼容,并考虑可一致性,强烈建议删除public模式不使用

若经评估不适合删除public模式,为避免不小心误将对象创建public模式下,至少应撤销在public模式下创建对象权限,命令参考如下

--默认:所有用户对public模式具有CREATE和USAGE权限。
--撤销在public模式下创建对象权限。第一个public指模式名,第二个PUBLIC表示所有用户
REVOKE CREATE ON SCHEMA public FROM PUBLIC;

--以超级用户,修改所有用户的search_path,去除public(重新登录后生效)
ALTER ROLE ALL SET search_path TO "$user";

--修改数据库,去除public(重新连接生效)
ALTER DATABASE 数据库名 SET search_path TO "$user";

--删除模式
DROP SCHEMA public;

  建议对template1中删除public模式

建议将template1模板中的public模式删除,这样使用template1模板在新创建数据库时,新库就不再有public模式

--连接
\c template1;

--修改数据库,去除public
ALTER DATABASE template1 SET search_path TO "$user";

--删除模式
DROP SCHEMA public;

表Table 

  表创建、插入、删除

略。

注意:在PostgreSQL更新一条数据,源数据并不会覆盖,而是会插入一条新的数据。

  表结构复刻

CREATE TABLE 新表名 (LIKE 母表 like_option)

like_option常见的:
   INCLUDING COMMENTS
   INCLUDING COMPRESSION
   INCLUDING CONSTRAINTS
   INCLUDING DEFAULTS
   INCLUDING GENERATED
   INCLUDING IDENTITY
   INCLUDING INDEXES --新的索引名为:新表名_涉及字段名_idx
   INCLUDING STATISTICS
   INCLUDING STORAGE
   INCLUDING ALL

CREATE TABLE LIKE:以母表为源复刻表结构,不涉及数据。

CREATE TABLE AS: 以select结果集创建表并fill填充数据

  临时表

CREATE TEMPORARY TABLE tb_tmp_t1 (name varchar(32));

\d+ tb_tmp_t1;

  • 临时表分为两种:会话级别、事务级别。在创建临时表语句增加ON COMMIT选型来区分。
  • 临时表在会话结束后,表即会消失(表数据和表结构均会消失)
  • 临时表所属的schema为特殊schema,名字为pg_temp_N (不同的会话N不同)

  UNLOGGED表

CREATE UNLOGED TABLE tb_unlogged_t01 (name varchar(32));

 UNLOGGED表不会写WAL日志,无法实现主备库之间同步(在主库机器上会存储该表),使用上与普通表没有区别。UNLOGGED在插入/删除/更新性能会略高。

索引Index 

略。

PostgreSQL支持在创建索引是通过选项CONCURRENTLY进行并发创建索引,避免在创建过程中阻塞对表的插入/删除/更新操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1682965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue】性能优化

使用 key 对于通过循环生成的列表&#xff0c;应给每个列表项一个稳定且唯一的 key&#xff0c;这有利于在列表变动时&#xff0c;尽量少的删除和新增元素。 使用冻结的对象 冻结的对象&#xff08;Object.freeze(obj)&#xff09;不会被响应化&#xff0c;不可变。 使用函…

【贪心算法题目】

1. 柠檬水找零 这一个题目是一个比较简单的模拟算法&#xff0c;只需要根据手里的钱进行找零即可&#xff0c;对于贪心的这一点&#xff0c;主要是在20元钱找零的情况下&#xff0c;此时会出现两种情况&#xff1a;10 5 的组合 和 5 5 5 的组合&#xff0c;根据找零的特点&a…

通过管理系统完成商品属性维护

文章目录 1.数据库表设计1.商品属性表 2.renren-generator生成CRUD1.基本配置检查1.generator.properties2.application.yml 2.启动RenrenGeneratorApplication.java生成CRUD1.启动后访问localhost:812.生成商品属性表的crud 3.将crud代码集成到项目中1.解压&#xff0c;找到ma…

Gittee

前言&#xff1a; 海鸥禁止 git简述 分布式版本控制系统 版本管理 集中式只有一个档案馆 分布式可以每人有一个档案馆&#xff0c;版本合并 协同工作 github&#xff0c;gitlab&#xff0c;gitee是git的托管平台 安装git 略 添加&#xff0c;提交文件 推到远程仓库 常…

vscode安装多版本esp-idf

安装 离线安装 vscode设置 建立一个新的配置文件, 这里面的插件是全新的 安装esp-idf 官网下载espidf 安装这一个 选项默认即可 记住各一个路径, 之后要用到 vscode安装插件 安装以后会进入这一个界面, 也可以CtrlShiftP输入ESP-IDFextension进入 使用espressif 问题 这一个…

微信小程序---小程序文档配置(2)

一、小程序文档配置 1、小程序的目录结构 1.1、目录结构 小程序包含一个描述整体程序的 app 和多个描述各自页面的 page 一个小程序主体部分由三个文件组成&#xff0c;必须放在项目的根目录 比如当前我们的《第一个小程序》项目根目录下就存在这三个文件&#xff1a; 1…

【论文速读】|探索ChatGPT在软件安全应用中的局限性

本次分享论文&#xff1a;Exploring the Limits of ChatGPT in Software Security Applications 基本信息 原文作者&#xff1a;Fangzhou Wu, Qingzhao Zhang, Ati Priya Bajaj, Tiffany Bao, Ning Zhang, Ruoyu "Fish" Wang, Chaowei Xiao 作者单位&#xff1a;威…

day08-Java常用API

day08——Java常用API 一、今日内容介绍、API概述 各位同学&#xff0c;我们前面已经学习了面向对象编程&#xff0c;使用面向编程这个套路&#xff0c;我们需要自己写类&#xff0c;然后创建对象来解决问题。但是在以后的实际开发中&#xff0c;更多的时候&#xff0c;我们是…

Linux软硬链接及动静态库

软硬链接与动静态库 软连接 创建链接的方法&#xff1a; ln -s test1.txt test2.txt 其中ln 是link(链接)&#xff0c;-s 是soft(软)&#xff0c;后者链接前者。 此时打开test2.txt&#xff0c;发现其中内容与test.txt一致。那么软连接到底建立了什么联系&#xff1f;…

Python函数进阶:四大高阶函数、匿名函数、枚举、拉链与递归详解

系列文章目录 Python数据类型&#xff1a;编程新手的必修课深入探索Python字符串&#xff1a;技巧、方法与实战Python 函数基础详解Python正则表达式详解&#xff1a;掌握文本匹配的魔法Python文件操作宝典&#xff1a;一步步教你玩转文件读写Python面向对象基础与魔法方法详解…

添加webpack.config.js配置

webpack 命令默认会去根目录查找webpack.config.js配置文件&#xff0c;如果没有&#xff0c;则会使用webpack默认的零配置打包规则进行打包&#xff0c;默认的零配置打包规则主要包括下面这几点&#xff1a; 1. 默认入口文件&#xff1a;Webpack 默认会将 ./src/index.js 作为…

“壕无人性”的沙特也要买量子计算机!巨头沙特阿美的合作方竟是它?

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;1200字丨5分钟阅读 摘要&#xff1a;石油巨头沙特阿美与 Pasqal 开启合作&#xff0c;计划于 2025 年部署一台 200 量子比特的量子计算机&#xff…

开源大模型与闭源大模型:技术哲学的较量

目录 前言一、 开源大模型的优势1. 社区支持与合作1.1 全球协作网络1.2 快速迭代与创新1.3 共享最佳实践 2. 透明性与可信赖性2.1 审计与验证2.2 减少偏见与错误2.3 安全性提升 3. 低成本与易访问性3.1 降低研发成本3.2 易于定制化3.3 教育资源丰富 4. 促进标准化5. 推动技术进…

【qt】QDockWidget 浮动窗口

QDockWidget 浮动窗口 一.QDockWidget 的用法 前言&#xff1a;很简单&#xff0c;放心食用 一.QDockWidget 的用法 太简单了&#xff0c;直接来吧&#xff01; 直接做个小项目来了解QDockWidget 的用法 目标效果图&#xff1a; 开始拖放&#xff1a; 开始布局&#xff1a; …

Jenkins pipeline发布前端项目

说明&#xff1a;第一次使用jenkins生成pipeline片段&#xff0c;做个记录... 1.全局工具配置添加自定义node版本 2.系统管理添加前端应用部署服务器 2.1 点击高级选择账号密码验证方式&#xff0c;添加服务器的用户和密码 3.系统管理--凭据--系统--全局凭据--添加自己的git凭据…

R语言数据分析案例-巴西固体燃料排放量预测与分析

1 背景 自18世纪中叶以来&#xff0c;由于快速城市化、人口增长和技术发展&#xff0c;导致一氧化二氮&#xff08;N2O&#xff09;、 甲烷&#xff08;CH4&#xff09;和二氧化碳&#xff08;CO 2&#xff09;等温室气体浓度急剧上升&#xff0c;引发了全球变暖、海平面上 升…

[Cocos Creator 3.5赛车游戏]第5节 为汽车节点挂载自定义脚本

在前面的章节中您已经学会了如何创建一个汽车节点&#xff0c;这一章我们将会学习如何通过挂载自定义节点的方式让小车变得可控制&#xff0c;所以通过这一章的学习后&#xff0c;您将实现一个效果&#xff1a;开始运行后&#xff0c;小车每隔一帧就延y轴向上移动一段距离。在这…

vs无法打开或包括文件”QTxxx“

vs创建项目时默认引入core、gui、和widgets等模块&#xff0c;在需要网络通讯或者图表等开发时需要添加相应模块。 点击扩展 -> QT VS Tools -> QT Project Setting->Qt Modules&#xff0c;添加相应模块即可

OpenAI、微软、智谱AI 等全球 16 家公司共同签署前沿人工智能安全承诺

人工智能&#xff08;AI&#xff09;的安全问题&#xff0c;正以前所未有的关注度在全球范围内被讨论。 日前&#xff0c;OpenAI 联合创始人、首席科学家 Ilya Sutskever 与 OpenAI 超级对齐团队共同领导人 Jan Leike 相继离开 OpenAI&#xff0c;Leike 甚至在 X 发布了一系列…

Java中Spring MVC 来如何接收表单数据

目录 一、Java语言介绍 二、Spring MVC 框架介绍 三、什么是表单 四、Spring MVC 来如何接收表单数据 一、Java语言介绍 Java是一种广泛使用的面向对象的编程语言&#xff0c;由Sun Microsystems公司的James Gosling等人开发。它最初于1995年发布&#xff0c;被设计为具有…