【postgresql 基础入门】基础架构和命名空间层次,查看数据库对象再也不迷路

这篇具有很好参考价值的文章主要介绍了【postgresql 基础入门】基础架构和命名空间层次,查看数据库对象再也不迷路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

postgresql 基础架构

专栏内容

  • postgresql内核源码分析
  • 手写数据库toadb
  • 并发编程

开源贡献

  • toadb开源库

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

系列文章

  • 入门准备
  • postgrersql基础架构
  • 快速使用
  • 初始化集群
  • 数据库服务管理
  • psql客户端使用

前言

postgresql 数据库是一款通用的关系型数据,在开源数据库中能与商业数据媲美,在业界也越来越流行。

因为是开源数据库,不仅公开源码,还有很多使用案例,好用的插件,所以它的慢慢变成了数据库的先驱和标准,通过postgresql可以很好从使用到原理,彻底搞懂;

如果是学习编程,也可以学到丰富的编程知识,数据结构,编程技巧,它里面还有很多精妙的架构设计,分层思想,可以灵活定制的思想。

本专栏主要介绍postgresql 入门使用,数据库维护管理,通过这些使用来了解数据库原理,慢慢了解postgresql是什么样的数据库,能做那些事情,以及如何做好服务,最关键的是这些知识都是面试的必备项。

概述

本文主要分享PostgreSQL的基础的架构,方便我们对对PostgreSQL的部件之间如何相互作用的理解将会使本节更易理解,在我们使用的时候,不至于与其它类型的数据库产生混淆;

这里我们会介绍两种视角下的架构,

  • 一是运行架构,当postgresql运行起来时,它是如何提供服务的;
  • 二是逻辑架构,用户创建的各数据库对象之间的关系是怎么样,如何进行组织;

运行架构

原理介绍

在postgresql数据库服务是一种C/S模式,运行之后,之前博客已经介绍过,后台会运行一个主进程,还有几个子进程,它们共同提供服务;

主进程提供网络监听,当客户端有连接到来时,主进程就会创建一个名称为postgres子进程,也叫做后端服务进程,它专门为这个客户端连接提供服务,此时客户端与后端服务进程之间直接通信;
也就是说,服务主进程会为每个客户端连接都创建一个后端服务进程;

客户端可以在不同的机器上,通过tcp/ip协议与服务端进行通讯;
当然客户端是多种多样的,可以是一个面向文本的工具, 也可以是一个图形界面的应用,或者是一个通过访问数据库来显示网页的网页服务器,或者是一个特制的数据库管理工具;

进程介绍

接着上一篇启动的数据库服务继续介绍,我们用psql连接了数据库之后,看看后台进程的变化:

[senllang@hatch bin]$ ps -ef|grep postgres
senllang  149106       1  0 Sep03 ?        00:00:00 /opt/postgres/bin/postgres -D testdemo1
senllang  149107  149106  0 Sep03 ?        00:00:00 postgres: logger
senllang  149108  149106  0 Sep03 ?        00:00:00 postgres: checkpointer
senllang  149109  149106  0 Sep03 ?        00:00:00 postgres: background writer
senllang  149111  149106  0 Sep03 ?        00:00:00 postgres: walwriter
senllang  149112  149106  0 Sep03 ?        00:00:00 postgres: autovacuum launcher
senllang  149113  149106  0 Sep03 ?        00:00:00 postgres: logical replication launcher
senllang  175300  175236  0 08:38 pts/8    00:00:00 ./psql -d postgres
senllang  175301  149106  0 08:38 ?        00:00:00 postgres: senllang postgres [local] idle

较刚启动时,多了两个进程,一个是 psql客户端进程,一个是服务端的子进程postgres,PID为 175301, 进程名称上会显示状态 idle, 当执行SQL时也会显示到这里。
如果有多个客户端连接时,这里就会有多个postgres后端服务进程;

逻辑架构

在使用数据库之前,我们有必要了解一下数据库中的各数据库对象之间的组织关系;

我们已经听说过的数据库里会有:database 数据库, table 表, tablespace 表空间,index 索引, 表字段,数据类型,存储过程,数据库用户,对角访问权限等等,一大堆的概念;

一开始,是不是可以创建表呢,是不可以的,它是有先后顺序的;

它们之间存在两种逻辑上的关联关系:

  • 存储空间关系
  • 命名空间关系

存储空间关系

存储空间关系是什么呢,简单理解就是,目录层次关系,大的是父目录,小的是子目录,先有前者,才可以有后者的存储位置;这是从磁盘存储的角度来看,各数据库对象之间的关系。

它们的前后顺序关系,或者是大小包含关系为

  • 数据库集群目录 这是最大的,这个数据库服务对应的数据都存放在这个目录下面;
  • tablespace 表空间,虽然叫做表空间,但是它目的是指定一个存储区域,刚初始化的集群,会有一个默认表空间,就在集群目录下,所有不指定表空间的数据库对象,都在默认表空间下;
  • database 数据库,其实每个数据为也对应了一个目录,那么在这个库下的所有内容都存放在此目录下面; 数据库 这个词有多个理解,大的来讲,数据库服务有时也简称数据库,小的来讲,只是database这个数据库对象,这里我们指数据库对象中的database;

表空间这一层级,主要是为了方便扩展存储空间;
因为目录没有办法跨磁盘空间,当集群目录对应的磁盘空间不足时,要么更换更大磁盘,将数据拷过去,这样旧的磁盘又会浪费,而且磁盘空间总不可能无限大,所以要扩展空间的话,可以再建一个表空间,表空间指定存储的位置在新在磁盘空间即可;

我们创建的表,索引,视图,存储过程,都在database这一级下存储;
数据库登陆的用户,角色数据,是最大的数据库集群目录下存储,它是公共数据,只要grant了权限,所有database都可以使用;
对于数据类型,这些大多是系统默认的,还有一部分是用户自定义的,也属于公共数据,存储在集群目录一级;

命名空间关系

命名空间,有点类似于目录关系,但它是逻辑上的,并不像目录是物理存在的;逻辑命名空间的目的,主要是为了方便管理和组织这些数据库对象,在内部可以方便查找,对于用户来讲也可以进行分组管理,精细化的权限控制。

主要分为以下命名空间层次:

  • tablespace 这是最大的一层,这与存储层次相同,用户不需要关心表空间,因为访问存在的数据库对象,它的表空间是确定的;如果需要创建时,需要指定,当然必须有对应表空间的使用权限才可以创建对象;
  • database 处于第二层,也是登录时必须指定的空间层次,所有在用户登录后,就不需要指定;
  • schema 处于第三层,一个database中,可以有多个schema,默认的schema名称为public,访问数据库对象时以 schema名称.数据库对象 的方式引用;

我们举例来说明,先创建一个目录,用来新建表空间

[senllang@hatch bin]$ mkdir tablespace_test1

新建表空间 tblspc_test1, 指定它的存储路径在刚才新建的目录下

postgres=# create tablespace tblspc_test1 location '/opt/postgres/bin/tablespace_test1';
CREATE TABLESPACE

新建一个schema test1

postgres=# create schema test1;
CREATE SCHEMA

设置当前的查找路径, 默认为public,现在设置为public和test1, 这样两个schema下的内容都可以看到

postgres=# set search_path TO 'public' ,'test1';
SET
postgres=# \d
           List of relations
 Schema |   Name    | Type  |  Owner
--------+-----------+-------+----------
 public | tbl_user  | table | senllang
 test1  | tbl_test1 | table | senllang
(2 rows)

可以看到 tbl_user 所属的schema为 public, 而test1所属的schema为 test1;

当我们有多个用户,多个应用数据时,它们又需要交互,在后面我们讲到用户和权限时,就可以看到它们真正的用途了。

总结

接触任何事务,都从第一眼看到了解开始,postgresql数据库的了解也是一样,我们可以看到它的服务启动后的进程组,了解它的进程关联;

数据库的数据存储组织的空间关系,有助于我们认识它内部的运行机制,在我们使用SQL进行数据操作时,有会用到命名空间的关系。

本文将从看到的开始,为后续继续学习做好基础,有兴趣的同学关注本专栏;

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!文章来源地址https://www.toymoban.com/news/detail-702192.html

到了这里,关于【postgresql 基础入门】基础架构和命名空间层次,查看数据库对象再也不迷路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • cpp入门-命名空间,缺省参数

    本小白不久前才刚开始学习c艹,众所周知,c艹是本贾尼祖师爷在使用c的时候遇到了诸多不便,便在对c进行扩展和改进后的得到的新语言,所以说 这一篇博客就带来c艹对c的两个个优化点 当我们在使用C进行日常编程时不会有太多关于变量的烦恼。 但是当我们进行一些中大项

    2023年04月19日
    浏览(45)
  • 【C++入门到精通】 C++入门—命名空间

            前面我们学习了C语言,并且知道了C语言的基础语法与用途。接下来一段时间我们会再来学习一下基于C语言并且根据C语言改造的一门新的语言—C++          硕硕相信只要各位大佬们跟着我的博客看下去,肯定能有不少的收获。二话不说咱们要开车了,坐稳扶好呦

    2024年02月16日
    浏览(44)
  • C++从入门到精通——命名空间

    命名空间是一种用于封装和组织代码的结构,可以避免名称冲突并提供更好的代码组织性。在编程中,命名空间通常用于将相关的类、函数、变量等组织在一起,形成一个独立的逻辑单元。通过使用命名空间,可以更加清晰地组织代码,提高代码的可读性和可维护性。同时,

    2024年04月09日
    浏览(43)
  • C++入门:命名空间与输入输出

    目录 1.命名空间 1.1 命名空间的定义 1.2 命名空间的使用 1.3 标准命名空间 std 2.C++输入输出 我们在初学C++时,经常会在代码开头看到这样的一行代码: 这行代码到底什么意思呢?我们学完命名空间就可以理解了。 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些

    2024年02月11日
    浏览(45)
  • C++--入门(命名空间&&缺省参数&&函数重载)

    目录 0.前言 1. C++(C++98)  2. 命名空间  3. C++输入输出 4. 缺省(默认)参数 5. 函数重载 6.C++支持函数重载的原理--名字修饰(name Mangling)         C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,

    2024年02月19日
    浏览(38)
  • 【C++入门系列】——命名空间和输入输出

    📚lovewold少个r博客主页     ⚠️ 本文重点 : c++入门第一个程序和基本知识讲解 😄 每日一言 :忙,不会死,人只有越忙越活,流水不腐,户枢不蠹。 ​作者主页 前言 谈谈我个人对语言和职业的看法 C++的历史发展 C++第一个程序 命名空间 定义命名空间 使用此命名空间 命

    2024年02月05日
    浏览(45)
  • C++入门 上(命名空间 缺省参数 函数重载)

    在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace的出现就是针对这种问题的。 定义命名空间

    2024年02月19日
    浏览(46)
  • 『C++成长记』C++入门——命名空间&缺省参数

     🔥 博客主页: 小王又困了 📚 系列专栏: C++ 🌟 人之为学,不日近则日退 ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、C++的认识 📒1.1什么是C++ 📒1.2C++的发展 二、C++ 三、命名空间 📒3.1为什么有命名空间 📒3.2命名空间定义 📒3.3命名空间使用 📒3.4命名空间的

    2024年02月08日
    浏览(37)
  • C++入门(1):命名空间,IO流 输入输出,缺省参数

    一、命名空间 1.1 命名空间的作用: ​ 避免标识符命名冲突 1.2 命名空间定义: :namespace PS: 命名空间可以嵌套. 在同一工程中,编译器会把 相同名称 的命名空间 合并 成到同一个命名空间中。 1.3 命名空间的使用 一个命名空间相当于定义了一个作用域,其中的所有内

    2024年02月07日
    浏览(45)
  • 【C++初阶】C++入门——C++介绍、命名空间、输入输出

     C语言是 结构化 和 模块化 的语言,适合处理 较小规模 的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了 OOP (object oriented programming: 面向对象 )思想,支持面向对象的程序设计语言应

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包