PostgreSQL的数据存储(六)---数据存储

4.1.2        “relation”如何与外部文件对应

对于数据库系统的用户而言,一个二维的表,是一个逻辑的概念,其包含两部分东西,一是表的结构信息(表定义,create table…语句);另外一个是表数据,即通过insert into插入到表中的数据。

表的定义,是展示用户逻辑的,表的定义需要被数据库系统保存,存放地点,则是系统表空间;表的数据,物理上,是以文件形式存储于操作系统,可以存放与系统的表空间,也可以存放于用户自定义的表空间;存放在表空间的数据,是以数据文件的形式存储的。数据文件是表空间的物理外在形式,表空间是数据文件在数据库中的逻辑名称。

所以,表定义,可以是看作逻辑概念,数据文件的存储,是物理形式,如何把两者通过数据库管理系统统一(衔接点),则是我们本节讨论的内容。

 

从数据结构看,如下结构是逻辑概念和物理存储衔接的纽带:

typedef struct RelFileNode

{

       Oid                spcNode;        /* tablespace */            //表空间的标识符号

       Oid                dbNode;                /* database */       //具体数据库的标识符号

       Oid                relNode;         /* relation */                //具体表的标识符号

} RelFileNode;

 

从代码季度分析,可以从relpathbackend函数入手,查看逻辑概念和物理存储之间的关系。

1.         本函数,根据数据库对象的RelFileNode指定的关系,找出外存对应的文件(文件位置)

2.         人口参数包括:RelFileNode rnode, BackendId backend, ForkNumber forknum

3.         第一个参数rnode,指出一个数据库中逻辑对象对应的外存文件信息,根据这个信息,可以拼接出外存文件的路径和文件名称(pg以数据库对象的ID值作为路径名称和对象名称,拼接规则,依赖于本函数中对“path”变量的赋值方式)

4.         根据rnode结构中的spcNode的值,判断要在物理存储的哪个表空间上操作dbNode指定数据库的relNode文件。这时,就有如下逻辑判断:

       if (rnode.spcNode == GLOBALTABLESPACE_OID)       {

              /* Shared system relations live in {datadir}/global */

       }

       else if (rnode.spcNode == DEFAULTTABLESPACE_OID)       {

              /* The default tablespace is {datadir}/base */

              if (backend == InvalidBackendId) {

              }

              else  {

                     /* OIDCHARS will suffice for an integer, too */

              }

       }

       else  {

              /* All other tablespaces are accessed via symlinks */

              if (backend == InvalidBackendId) {

              }

              else  {

                     /* OIDCHARS will suffice for an integer, too */

              }

       }

5.         最后得出文件的具体存放位置,注意在snprintf函数中对于文件路径的拼接方式,有所不同

 

PostgreSQL的数据存储(六)---数据存储 - 那海蓝蓝 - 那海蓝蓝的博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
postgresql-10.10-2-linux-x64-binaries.tar.gz 安装包 PostgreSQL经历了长时间的演变。该项目最初开始于在加利福尼亚大学伯克利分校的Ingres计划。这个计划的领导者迈克尔·斯通布雷克在1982年离开加利福尼亚大学伯克利分校去推进Ingres的商业化,但最后还是返回了学术界。在1985年返回伯克利之后,斯通布雷克开始了post-Ingres计划,致力于解决在1980年代早期所出现一些数据库系统存在的问题。Postgres和Ingres的代码库开始(并保持)完全分离。 新项目Postgres的目的是通过增加最少的功能来完全支持所需要的类型。这些功能包括类型定义和完整描述数据关系的能力。完整描述数据关系的能力之前虽广为使用但却需要由用户来维护。Postgres的数据库能够"理解"关系,并可以使用一定的规则以自然方式在相关的表中检索信息。 从1986年开始,该项目组发表了一些描述这一系统基本原理的论文,并在1988年实现并运行了一个Demo版本。项目组在1989年六月向少数用户发行了版本1.0,随后在1990年6月发行了带有全新规则系统的版本2.0。1991年的版本3.0再次重写了规则系统,并增加了对多个存储管理器的支持与改进的查询引擎。Postgres在1993年开始拥有大量用户,这些用户提供了大量的功能与优化建议。但是在发行了作为细节修正的版本4.0之后,Postgres计划就终止了。
PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,现在已经更名为PostgreSQL. PostgreSQL支持大部分SQL标准并且提供了许多其它现代特性:复杂查询、外键、触发器、视图、事务完整性等。 PostgreSQL 是一个免费的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。 事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。从技术角度来讲,PostgreSQL 采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写,由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型的数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。 本课程作为PostgreSQL数据库管理一,主要讲解以下内容:1.     PostgreSQL安装和环境准备2.     PostgreSQL数据查询3.     PostgreSQL 数据过滤4.     PostgreSQL 多表的联接5.     PostgreSQL数据的分组6.     PostgreSQL合集的操作7.   PostgreSQL 合集的分组

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值