【PostgreSQL】从零开始:(十二)PostgreSQL-数据库对象关系及定义

发布时间:2023年12月18日

在这里插入图片描述
从图中我们可以看出服务器对象的关系
现在我们来了解它们的定义

数据库服务器(Server)

数据库服务器是一种用来存储、管理和查询大量数据的服务器。它是一个独立的计算机系统,运行数据库管理系统(DBMS)软件,并提供对数据库的访问和操作。数据库服务器可以支持多个用户同时访问数据库,并提供高性能和可靠性的存储和处理数据的能力。
数据库服务器的主要功能包括:

  • 存储数据:数据库服务器用于存储结构化数据,如文本、数字、图像和多媒体文件等。
  • 管理数据:数据库服务器管理数据的结构、关系和完整性,确保数据的一致性和可靠性。
  • 查询和分析数据:数据库服务器提供查询语言和工具,用于检索和分析存储在数据库中的数据。
  • 提供安全性:数据库服务器提供对数据的安全性和访问权限的管理,确保只有授权的用户可以访问和操作数据库。
  • 备份和恢复:数据库服务器提供数据备份和恢复功能,以防止数据丢失和系统故障。
  • 支持并发访问:数据库服务器可以同时处理多个用户的请求,并提供高性能的并发访问能力。
  • 扩展性:数据库服务器可以通过增加硬件资源,如CPU、内存和存储空间,来支持更大规模的数据存储和访问需求。
  • 高可用性:数据库服务器可以通过冗余和容错机制,如主从复制和故障转移,提供高可用性和故障容错能力。

数据库(Databse)

数据库是描述了一个数据库的结构和内容的文件,它定义了数据库中的表、列、索引、约束等元素的定义和关系。数据库定义规定了数据库中的数据如何存储、组织和访问。数据库定义可以使用特定的语言(如SQL)来编写,并且可以被数据库管理系统(DBMS)解释和执行。

数据库定义包含了以下内容:

  • 表的定义:包括表的名称、列名、数据类型、长度和约束等。
  • 列的定义:包括列的名称、数据类型、长度和约束等。
  • 索引的定义:包括索引的名称、索引的类型和所包含的列等。
  • 视图的定义:包括视图的名称、视图所使用的表和视图的查询逻辑等。
  • 存储过程和函数的定义:包括存储过程和函数的名称、参数、返回值和实现逻辑等。
  • 触发器的定义:包括触发器的名称、触发器的事件和触发器的操作等。
  • 约束的定义:包括主键约束、外键约束、唯一约束和检查约束等。

数据库定义是数据库的基础,它决定了数据库如何进行数据存储和操作。在数据库设计和管理过程中,数据库定义起着重要的作用。

触发器(Trigger)

数据库触发器是一种特殊的存储过程,它在数据库中的表上定义,并在表发生特定的事件时被自动执行。触发器通常用于在数据库表中插入、更新或删除数据时执行额外的操作或验证。

数据库触发器一般由以下几个组成部分:

  • 事件:触发器是在数据库表上的特定事件发生时被触发执行的,例如插入、更新或删除操作。
  • 条件:触发器可以定义一个条件,只有当该条件为真时才会执行触发器的操作。
  • 触发操作:触发器可以定义在特定事件发生后执行的操作,例如插入、更新或删除其他表中的数据,或执行一段特定的存储过程。
  • 触发时间:触发器可以定义在事件发生之前或之后执行。

数据库触发器的作用主要有以下几个方面:

  • 数据完整性验证:触发器可以用于验证插入、更新或删除操作是否符合特定的约束或规则,如唯一性约束、外键约束等。
  • 业务逻辑处理:触发器可以执行一系列的操作,如计算字段的值、更新其他相关的数据等,以满足业务需求。
  • 数据审计:触发器可以用于记录数据库的变更操作,以便跟踪和审计数据的修改历史。

数据库触发器的定义语法和使用方式会因不同的数据库管理系统而有所差异,如在MySQL中使用"CREATE TRIGGER"语句来定义触发器,在Oracle中使用"CRAETE OR REPLACE TRIGGER"语句来定义触发器。

发布(Publication)

可以在任何物理复制主机上定义* publication 。定义发布的节点称为 publisher *。发布是从一个表或一组表中生成的一组更改,也可以称为更改集或复制集。每个出版物仅存在于一个数据库中。

发布与架构不同,并且不影响表的访问方式。如果需要,可以将每个表添加到多个出版物中。出版物当前可能仅包含表。必须明确添加对象,除非为ALL TABLES创建发布。

出版物可以选择将产生的更改限制为INSERT,UPDATE,DELETE和TRUNCATE的任意组合,类似于特定事件类型触发触发器的方式。默认情况下,将复制所有操作类型。

已发布的表必须具有配置的“副本身份”,以便能够复制UPDATE和DELETE操作,以便可以在订户侧标识要更新或删除的适当行。默认情况下,这是主键(如果有)。另一个唯一索引(具有某些其他要求)也可以设置为副本身份。如果该表没有任何合适的键,则可以将其设置为副本标识“ full”,这意味着整行成为键。但是,这是非常低效的,只有在没有其他解决方案可行的情况下,才应将其用作备用。如果在发布者侧设置了除“完整”以外的副本身份,则还必须在订户侧设置包含相同或更少列的副本身份。有关如何设置副本身份的详细信息,请参见REPLICA IDENTITY。如果将没有副本身份的表添加到复制UPDATE或DELETE操作的发布中,则随后的UPDATE或DELETE操作将在发布者上引起错误。 INSERT操作可以 continue 进行,而不考虑任何副本身份。

每个出版物可以有多个订阅者。

使用CREATE PUBLICATION命令创建发布,以后可以使用相应的命令更改或删除发布。

可以使用ALTER PUBLICATION动态添加和删除单个表。 ADD TABLE和DROP TABLE操作都是事务性的;因此,一旦提交事务,该表将在正确的快照处开始或停止复制。

外部数据封装器(Foreign Data Wrapper)

外部数据封装器也称外部数据包装器

PostgreSQL外部数据包装器(Foreign Data Wrapper,FDW)是一个扩展,允许将外部数据源连接到PostgreSQL数据库,以便可以像访问本地表一样访问外部数据。

使用外部数据包装器,可以轻松地从不同的数据源(如其他数据库、文件系统、Web服务等)中读取和写入数据,而无需将数据移动到本地数据库。

以下是使用PostgreSQL外部数据包装器的一般步骤:

  • 安装外部数据包装器扩展:首先,需要在PostgreSQL数据库中安装外部数据包装器的扩展。许多外部数据包装器已经作为PostgreSQL的扩展提供,例如postgres_fdw(用于连接到其他PostgreSQL数据库)、file_fdw(用于连接到本地文件系统)等。可以使用CREATE EXTENSION命令来安装这些扩展。
  • 创建外部服务器:接下来,需要创建一个外部服务器对象,该对象描述了如何连接到外部数据源。可以使用CREATE SERVER命令来创建外部服务器,并指定所需的连接参数。
  • 创建外部表:一旦创建了外部服务器,就可以创建外部表,它们是与外部数据源中的表相对应的对象。可以使用CREATE FOREIGN TABLE命令来创建外部表,并指定表的结构和映射到外部数据源中的表的列。
  • 访问外部表:一旦创建了外部表,就可以像访问本地表一样访问它们。可以使用SELECT、INSERT、UPDATE和DELETE等SQL命令来查询和操作外部表的数据。当查询外部表时,外部数据包装器会将查询转换为适合外部数据源的查询,并将结果返回给用户。

需要注意的是,不同的外部数据包装器可能具有不同的配置和功能。在使用特定的外部数据包装器之前,建议查阅其文档以了解详细的设置和使用说明。

总的来说,PostgreSQL外部数据包装器提供了一种灵活和强大的方式,可以轻松地连接到外部数据源,并在PostgreSQL数据库中访问和操作外部数据。

强制转换(Casts)

PostgreSQL Casts提供了一种将值从一种数据类型转换为另一种数据类型的机制。它允许开发人员执行显式的数据类型转换,以及在查询中自动进行隐式的数据类型转换。
PostgreSQL Casts的定义包括两个主要部分:

显式Cast:显式Cast是指通过使用CAST函数或::运算符来执行数据类型转换。可以将一个值转换为另一个数据类型,并将结果作为新的表达式返回。例如,可以将一个字符型值转换为整数型值。
例如,以下语句使用CAST函数将字符型值’123’转换为整数型值:

SELECT CAST('123' AS INTEGER);

隐式Cast:隐式Cast是指在查询中自动执行的数据类型转换。当使用不同数据类型的值进行比较或操作时,PostgreSQL会自动执行必要的数据类型转换以匹配操作数的数据类型。例如,如果一个表中的一列是整数类型,而另一列是字符类型,那么在比较这两列时,PostgreSQL会自动将字符类型的列转换为整数类型。
例如,以下查询比较了一个整数型列和一个字符型列的值。由于数据类型不匹配,PostgreSQL会使用隐式Cast将字符型列转换为整数型列,并进行比较。

SELECT * FROM table WHERE integer_column = '123';

总的来说,PostgreSQL Casts提供了一种强大的机制来处理不同数据类型之间的转换,使开发人员可以更灵活地操作和比较数据。

扩展(Extensions)

PostgreSQL 扩展功能,可以增强其功能和性能。
以下是一些常用的 PostgreSQL 扩展:

  • PostGIS:PostGIS 是一个空间和地理对象的存储引擎。它允许存储和操作具有地理坐标信息的数据,如点、线、多边形等。PostGIS 还提供了一组强大的地理计算函数,用于查询和分析空间数据。
  • pgRouting:pgRouting 是一种用于计算最短路径和最近邻的扩展。它提供了一组函数,包括 Dijkstra 算法、A* 算法等,可以用于路网分析、路径规划等应用。
  • TimescaleDB:TimescaleDB 是一个时序数据库扩展,专门用于处理大规模时序数据。它提供了类似于传统关系型数据库的 SQL 查询语言,同时支持时间范围查询、数据分区等功能,可以高效地存储和查询时间序列数据。
  • PL/Python:PL/Python 允许在 PostgreSQL 中使用 Python 作为存储过程和触发器的编程语言。它使得用户可以使用 Python 编写自定义函数和脚本,从而扩展 PostgreSQL 的功能。
  • pg_stat_statements:pg_stat_statements 是一个性能监控扩展,用于跟踪和分析查询的执行情况。它可以记录查询的执行时间、I/O 开销、扫描行数等信息,并提供了一组视图和函数,用于查询和分析查询性能。

这只是一小部分 PostgreSQL 扩展的例子,还有很多其他的扩展可以根据具体需求选择和使用。可以通过 PostgreSQL 的扩展官方网站(https://www.postgresql.org/download/extensions/)查找和下载更多的扩展。

架构(Schema)

在PostgreSQL中数据库下面相比Oracle数据库多了一层,命名为架构(Schema),也有人称为模式
数据库架构定义了数据库中的结构和约束。它描述了数据库中的表、列、索引和关系等对象,并定义了它们之间的关系和约束条件。
数据库架构可以包含以下内容:

  • 表:定义了数据存储的主要结构单元。每个表都有一个唯一的名称,并包含一系列的列(字段)和行(记录)。
  • 列:定义了表中的每个字段的名称、数据类型和约束条件。列可以是字符型、数值型、日期型等。
  • 主键:用于唯一标识每个表中的每一行。主键可以由一个或多个列组成,它们的值必须是唯一的。
  • 外键:用于建立表与表之间的关系。它定义了一个表中的列与另一个表中的列之间的关联。外键可以用来实现数据的引用完整性,确保关联数据的一致性。
  • 索引:用于加快数据访问的速度。它是一个数据结构,用于快速定位表中满足特定条件的行。索引可以基于一个或多个列。
  • 触发器:定义了在特定的数据库操作(如插入、删除、更新)发生时自动执行的操作。触发器可以用于实现数据的业务逻辑和约束条件。
  • 视图:是一个虚拟的表,它是基于一个或多个表的查询结果。视图可以用于简化复杂的查询操作,并保护敏感数据。
  • 存储过程:是一组预定义的SQL语句,它们可被多次调用。存储过程可以用于实现复杂的业务逻辑和数据操作。

全文搜索模板 (FTS templates)

在PostgreSQL中,全文搜索(FTS)模板用于定义全文搜索功能的自定义配置。FTS模板允许你指定文本文档在PostgreSQL中应该如何被索引和搜索。

FTS模板是使用CREATE TEXT SEARCH TEMPLATE命令定义的。语法如下:

CREATE TEXT SEARCH TEMPLATE template_name (
    INIT = initialization_function,
    LEXIZE = lexize_function
);

这里,template_name是FTS模板的名称,initialization_function是负责初始化模板的函数,lexize_function是用于标记要索引的文本的函数。
初始化函数负责创建FTS模板使用的任何必要的数据结构或资源。它在模板创建期间被调用一次。
对被索引的文本中的每个标记调用lexize函数。它接受标记并返回要索引的词素(规范化标记)数组。
一旦创建了FTS模板,就可以使用ALTER TEXT search configuration命令在全文搜索配置的定义中使用它。

ALTER TEXT SEARCH CONFIGURATION configuration_name
    ALTER MAPPING FOR token_type WITH template_name;

这里,configuration_name是全文搜索配置的名称,token_type是要与模板关联的令牌类型的名称,template_name是要使用的FTS模板的名称。

通过定义自定义FTS模板,您可以控制文本数据在PostgreSQL中索引和搜索的方式,从而实现更强大、更灵活的全文搜索功能。

全文搜索解析器(FTS Parsers)

PostgreSQL FTS(全文搜索)提供了几个解析器,可以用来标记和处理全文搜索的文本数据。这些解析器用于将输入文本转换为一组可以有效索引和搜索的词素或令牌。
以下是一些常用的PostgreSQL FTS解析器:

  • Simple: Simple解析器通过根据空白字符将输入文本分割成单词来执行基本的标记化。它不执行词干提取或任何特定于语言的处理。
  • Snowball: Snowball解析器使用Snowball词干库执行特定于语言的词干提取。它支持多种语言,如英语、法语、西班牙语、德语等等。
  • 标准解析器:标准解析器是一个更高级的解析器,它执行标记化、词干提取和停止词删除。它是语言感知的,支持多种语言。它基于uax# 29 Unicode文本分割算法,并为大多数语言提供了良好的默认行为。
  • 字典:PostgreSQL允许您使用字典文件创建自定义解析器。字典解析器允许您定义自定义标记化规则、词干提取算法和停止词列表。这使您可以完全控制解析过程。

要指定要使用的解析器,您可以使用default_text_search_config配置参数在数据库级别设置它,也可以使用to_tsquery和to_tsvector函数在每个查询中指定它。
下面是一个在查询中指定解析器的示例:

SELECT *
FROM my_table
WHERE to_tsvector('english', 'text to search') @@ to_tsquery('english', 'search query');

在本例中,'english’解析器用于标记化和查询解析。

全文搜索词典(FTS Dictionaries)

PostgreSQL词典也叫做字典,是一个强大的功能,它允许您创建自定义字典并定义如何在数据库上执行文本搜索。字典确定在文本搜索操作期间对文本数据进行标记、规范化和词干提取的规则。
以下是关于PostgreSQL字典的一些关键点:

  • 标记化:标记化是将文本分解为单个单词或标记的过程。PostgreSQL字典定义了如何在数据库中对单词进行标记。默认字典根据空格和标点符号对文本进行标记。但是,您可以创建自定义字典来定义自己的标记化规则。
  • 规范化:规范化是将文本转换为标准形式的过程。PostgreSQL字典可以指定文本搜索的规范化规则。这允许您处理大小写、重音和其他文本差异的变化。规范化确保在搜索过程中将不同形式的单词视为相同的。
  • 词干化:词干化是将单词还原为词根或词干形式的过程。PostgreSQL字典可以定义词干规则来提高搜索精度。词干提取有助于匹配具有相同词根的单词,即使它们有不同的结尾或变化。例如,词干词典可以匹配“running”和“run”或“cars”和“car”。
  • 字典类型:PostgreSQL支持多种字典类型,包括简单字典、雪球字典和自定义字典。简单字典是默认的,它支持标记化,但不执行规范化或词干提取。雪球字典是一个扩展,为多种语言提供高级语言算法。自定义字典允许您使用SQL函数定义自己的规则。
  • 字典安装:PostgreSQL附带了一组预安装的字典,但如果需要,您也可以安装额外的字典。您可以从PostgreSQL Extensions网站下载字典,也可以从头创建自定义字典。要安装字典,您需要数据库的管理权限。

总之,PostgreSQL字典提供了一种灵活的方式来定义数据库中的文本搜索操作。通过创建自定义字典或使用预先构建的字典,您可以提高文本搜索查询的准确性和相关性。

全文搜索配置(Configurations)

PostgreSQL FTS(全文搜索)配置允许您定义如何处理和排序文本搜索查询。以下是一些PostgreSQL中常用的FTS配置选项:

  • 简单:该配置使用非字母数字字符作为分隔符将文本分割成单词。它不支持词干提取或排序。
  • 英文:此配置是专门为英文文本设计的。它支持词干提取(将单词缩减到它们的词根形式)和基于单词位置和出现次数的排序。
  • 法语:类似于英语配置,但专门为法语文本设计。
  • 雪球:这个配置使用雪球梗,它支持多种语言。它提供基于单词位置的词干提取和排序。
  • 取消重音:此配置从字母中删除重音,并允许不区分重音的搜索。
  • Websearch:这个配置是为web搜索而设计的。它执行词干提取,根据词频进行排序,并忽略常见的停用词。

您可以通过组合PostgreSQL提供的各种文本处理选项并定义自己的排序规则来创建自己的自定义FTS配置。
要创建自定义FTS配置,需要使用“create TEXT SEARCH configuration”语句执行一系列SQL命令。您可以根据需要定义标记化规则、字典、停止词和其他设置。
一旦创建了FTS配置,您可以通过在’tsvector’或’tsquery’函数的’USING’子句中指定配置名称来在查询中使用它。
例如,要使用’english’配置执行全文搜索,您可以使用以下查询:

SELECT * FROM your_table WHERE to_tsvector('english'' your_column ') @@ to_tsquery('english''search_term');

这将返回’search_term’出现在’your_column’列中的所有行,使用’english’配置进行文本处理和排序。
FTS配置是PostgreSQL的一个强大功能,它允许您自定义全文搜索的执行方式。通过选择正确的配置和定义自己的规则,您可以提高文本搜索查询的准确性和相关性。

函数(Functions)

PostgreSQL函数是可重用的代码块,可以在SQL查询中调用或独立执行。PostgreSQL中的函数可以用于各种目的,包括数据操作、计算、验证等等。在这里除了系统函数外的自定义函数。
PostgreSQL提供了广泛的内置函数,您也可以使用PostgreSQL支持的PL/pgSQL、SQL或其他可用的编程语言创建自定义函数。函数在扩展PostgreSQL的功能和通过将逻辑封装到可重用的代码块中来简化复杂任务方面起着至关重要的作用。

域(Domains)

在PostgreSQL中,域是一种用户定义的数据类型,它允许你在现有数据类型的基础上创建一个带有附加约束或规则的自定义数据类型。域提供了一种增强数据完整性、提高清晰度和简化数据库中数据类型管理的方法。
以下是在PostgreSQL中使用域的一些关键特性和好处:

  • 数据完整性:域允许您定义可以存储在列中的值的约束。您可以为域值指定允许的范围、格式或模式等规则。这有助于确保数据的一致性和有效性。
  • 清晰度和文档:域在基本数据类型之上提供了一个语义层,允许您定义自定义名称,以便更好地描述数据的目的或含义。通过使用域,您可以提高模式的可读性和可理解性。
  • 集中管理:在使用域时,您可以在一个中心位置定义约束和规则。这使得管理和维护共享同一域的多个表或列的一致性变得更加容易。
  • 灵活性:域可以与各种数据类型一起使用,包括数字、字符、日期/时间和自定义类型。您可以根据内置的PostgreSQL数据类型定义域,也可以创建自定义的组合类型。

域提供了一种在PostgreSQL中定义具有特定约束的自定义数据类型的强大方法。它们有助于确保数据完整性、提高清晰度并简化数据库模式中数据类型的管理。

外部表(Foreign Tables)

在PostgreSQL中,外表是表示存储在外部数据源中的数据的表,例如另一个PostgreSQL数据库,不同的数据库系统,甚至是文件。外部表允许您访问和操作这些外部源中的数据,就像它们是PostgreSQL数据库中的常规表一样。

以下是在PostgreSQL中使用外表的一些关键特性和好处:

数据集成:外部表使您能够将来自不同来源的数据集成到单个数据库中。您可以查询和连接来自多个数据库系统或文件格式的数据,而无需进行数据复制或复杂的数据同步。

简化数据管理:通过创建引用外部数据源的外表,您可以使用标准SQL语句(包括SELECT、INSERT、UPDATE和DELETE)管理和操作数据。这简化了数据管理,减少了对专用工具或脚本的需求。

性能优化:PostgreSQL的外部数据包装器(FDW)特性允许您定义到外部数据源的连接,并通过将操作下推到远程数据源来优化查询性能。这意味着某些操作,如过滤或聚合数据,可以直接在远程源上执行,从而减少数据传输和处理开销。

实时数据访问:使用外部表,您可以建立到外部数据源的实时连接并访问最新信息,而无需进行数据复制或批处理。这在需要与实时数据流或不断变化的数据源集成的场景中特别有用。

外表提供了一种强大的方式来集成和访问来自PostgreSQL外部数据源的数据。它们允许您使用标准SQL语法管理和查询来自不同系统的数据,通过查询下推优化性能,并在不需要数据复制的情况下访问实时数据。

存储过程(Procedures)

PostgreSQL没有像其他数据库系统中的存储过程那样的内置过程支持。然而,PostgreSQL确实提供了用各种编程语言编写函数的能力,这些语言可以用来实现类似的功能。

在PostgreSQL中,您可以使用SQL、PL/pgSQL (PostgreSQL特有的过程语言)或其他支持的编程语言(如Python、Perl或Java)编写函数。这些函数可用于封装一系列SQL语句,并可从其他SQL语句调用或用作触发器。

定义函数的输入参数,以及指定返回类型。此外,还可以使用修改数据或执行复杂计算的函数。
总之,PostgreSQL允许你用不同的编程语言编写函数来实现过程的功能。这些函数可用于封装SQL语句,并可从其他SQL语句调用或用作触发器。

序列(Sequences)

在PostgreSQL中,序列是一个数据库对象,它生成一系列唯一的值。序列通常用于生成表的主键值。下面是一个如何在PostgreSQL中创建和使用序列的例子:

序列为PostgreSQL中的主键或其他目的提供了一种简单有效的方法来生成唯一值。它们可以用于多个表和不同的事务。

排序规则(Collations)

PostgreSQL支持范围广泛的排序,这些排序定义了字符串比较和排序应该如何执行。可以在数据库、架构和列级别指定排序规则。

PostgreSQL中常用的排序规则包括:

  • C:默认排序,这是一个简单的字节到字节比较。
  • C.UTF-8:使用Unicode规则执行不区分大小写比较的排序规则。
  • en_US。UTF-8:使用Unicode规则执行不区分大小写比较的英文文本排序规则。
  • UTF8:使用Unicode规则执行区分大小写比较的排序规则。
  • POSIX:使用POSIX标准进行字符串比较和排序的排序。

PostgreSQL还允许您通过在现有排序规则的基础上定义新的排序规则来创建自定义排序规则,并添加额外的规则或修改。
总的来说,PostgreSQL中的排序提供了执行字符串比较和排序操作的灵活性,允许您支持各种语言和文化需求。

操作符集(Operators)

在 PostgreSQL 中,您可以自定义运算符以执行特定的操作。自定义运算符允许您定义自己的操作符号以及与之相关的语义。以下是在 PostgreSQL 中自定义运算符的步骤:

  • 创建运算符函数:首先,您需要创建一个函数来实现您想要的操作。这个函数应该接受适当的参数,并且返回一个结果。
  • 创建运算符:使用 CREATE OPERATOR 命令来创建您的自定义运算符。指定运算符名称、左侧和右侧操作数的数据类型,以及运算符函数的名称。您还可以指定运算符的优先级和结合性。
  • 注册运算符:使用 CREATE OPERATOR CLASS 或 ALTER OPERATOR FAMILY 命令将新创建的运算符添加到运算符类或运算符族中。这将确保 PostgreSQL 在执行查询时正确解析和执行您的自定义运算符。
  • 测试运算符:使用测试数据进行测试,确保您的自定义运算符按预期工作。

请注意,自定义运算符需要小心使用,以避免与标准操作符发生歧义或引起混淆。在定义自定义运算符时,请确保与 PostgreSQL 的内置运算符以及其他已定义的自定义运算符之间保持一致性和一致性。

物化视图(Materialized Views)

在 PostgreSQL 中,Materialized Views(物化视图)是预计算和存储的查询结果集。与普通视图不同,物化视图在创建时会将查询结果保存在磁盘上,并在需要时提供直接访问。这提高了查询性能,尤其是对于频繁执行的复杂查询。

以下是使用物化视图的步骤:

物化视图提供了查询性能的提升,但需要注意的是,物化视图需要额外的存储空间,并且在基础表数据改变时需要手动刷新。因此,您需要评估是否使用物化视图对于您的情况是合适的,并根据需要定期刷新它们。

类型(Types)

PostgreSQL 支持自定义类型,这使得用户可以根据自己的需求定义新的数据类型。自定义类型可以是基于现有的内置类型或已定义的其他自定义类型。

要创建一个自定义类型,可以使用 CREATE DOMAIN 或 CREATE TYPE 语句。

CREATE DOMAIN 语句用于基于现有的内置类型创建一个新的域类型。域类型提供了对现有类型的一个限制或约束,可以添加约束条件来限制该类型的取值范围。

例如,以下是创建一个自定义的邮件地址类型的示例:

CREATE DOMAIN email_address AS varchar(255)
   CHECK (value ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');

上述语句创建了一个名为 email_address 的域类型,它基于 varchar(255) 类型,并添加了一个正则表达式约束来验证是否是有效的邮件地址。
另一种创建自定义类型的方法是使用 CREATE TYPE 语句。这种方式可以创建更复杂的自定义类型,例如复合类型、枚举类型等。

CREATE TYPE person AS (
   first_name varchar(50),
   last_name varchar(50),
   age integer
);

上述语句创建了一个名为 person 的复合类型,它包含了 first_name、last_name 和 age 三个字段。
自定义类型可以在表的列中使用,也可以在函数的参数和返回值中使用。可以使用类型转换函数将自定义类型转换为其他类型,或将其他类型转换为自定义类型。
总结起来,PostgreSQL 提供了多种创建自定义类型的方法,用户可以根据自己的需求定义新的数据类型并在数据库中使用。

聚合集(Aggregates)

在PostgreSQL中,可以使用CREATE AGGREGATE语句定义自定义聚合函数。
以下是一个示例,展示如何创建一个计算平均值的自定义聚合函数:

CREATE AGGREGATE avg_custom (
    SFUNC = numeric_avg_accum,
    STYPE = numeric,
    INITCOND = '0'
);

在上面的示例中,我们创建了一个名为avg_custom的自定义聚合函数。它使用numeric_avg_accum作为其状态转换函数(SFUNC),numeric作为其状态类型(STYPE),并使用’0’作为初始条件(INITCOND)。
要使用自定义聚合函数,可以在SELECT语句中使用它,就像使用内置聚合函数一样:

SELECT avg_custom(some_column) FROM some_table;

自定义聚合函数的状态转换函数(SFUNC)定义了如何将每个输入值聚合到聚合的状态中。在这个例子中,我们使用numeric_avg_accum函数来计算平均值。
自定义聚合函数的状态类型(STYPE)定义了聚合的中间状态的数据类型。在这个例子中,我们使用numeric作为状态类型。
自定义聚合函数的初始条件(INITCOND)定义了聚合的初始状态。在这个例子中,我们将初始状态设置为’0’。
通过创建自定义聚合函数,您可以根据自己的需求定义各种聚合操作。

表(Tables)

在 PostgreSQL 中,可以使用 CREATE TABLE 命令创建自定义表。
你可以根据自己的需求修改列的名称、类型和约束。创建表后,你可以使用 INSERT INTO 命令向表中插入数据,使用 SELECT 命令从表中查询数据,使用 UPDATE 命令更新表中的数据,使用 DELETE FROM 命令删除表中的数据。

视图(Views)

PostgreSQL中的视图是通过执行SELECT查询并存储结果集而创建的虚拟表。
创建视图的主要目的是封装复杂的查询或在底层数据库模式上提供抽象层。这允许用户像查询普通表一样查询视图,而不需要知道底层表的详细信息。

总的来说,PostgreSQL中的视图提供了一种方便的方式来简化复杂的查询,通过限制对底层表的访问来提高安全性,并为数据库提供了一个更友好的界面。

触发器函数(Trigger Functions)

在PostgreSQL中,触发器函数是用户自定义的函数,它在响应某些事件时自动执行,例如表上的插入、更新或删除操作。这些函数可以与特定的表关联,并在触发事件发生之前或之后执行。
触发器函数可以分别使用OLD和NEW变量访问OLD和NEW行值。这些变量允许您访问触发事件前后的值。
总的来说,PostgreSQL中的触发器函数提供了一个强大的机制来自动响应数据库事件,允许您执行业务规则,维护数据一致性,并执行复杂的计算或验证。

目录(Catalogs)

PostgreSQL catalogs是数据库系统中用于存储和管理元数据的系统表。这些系统表包含了关于数据库、模式、表、列、索引、约束、触发器和其他对象的信息。
以下是一些常见的 PostgreSQL catalogs:

  • pg_database:该表存储了数据库的信息,例如数据库名称、所有者、创建日期等。
  • pg_namespace:该表存储了模式(schema)的信息,包括模式名称、所属数据库等。
  • pg_class:该表存储了表和视图的信息,包括表名、所属模式、表类型(表还是视图)等。
  • pg_attribute:该表存储了表和视图的列信息,包括列名、数据类型、列约束等。
  • pg_index:该表存储了索引的信息,包括索引名称、所属表、索引类型等。
  • pg_constraint:该表存储了约束的信息,包括主键约束、外键约束、唯一约束等。
  • pg_trigger:该表存储了触发器的信息,包括触发器名称、所属表、触发时机等。
  • pg_views:该表存储了视图的信息,包括视图名称、所属模式、视图定义等。
  • pg_roles:该表存储了数据库角色(用户和组)的信息,包括角色名称、角色类型、密码哈希等。

以上只是一些常见的 PostgreSQL catalogs,每个版本的 PostgreSQL 还可能存在其他的 catalogs。通过查询这些系统表,可以获取关于数据库结构、对象属性和依赖关系等重要的元数据信息。

订阅

PostgreSQL Subscriptions 是 PostgreSQL 中的一项功能,它允许您在数据库中创建和管理逻辑复制流。逻辑复制流是从一个数据库复制到另一个数据库的更高级别的复制形式,它允许您选择性地复制特定表或表中的特定列。
使用 PostgreSQL Subscriptions 可以实现以下功能:

  • 发布者(Publisher)和订阅者(Subscriber)之间的异步数据复制。
  • 实时数据推送到订阅者,以保持订阅者的数据与发布者同步。
  • 可以在订阅者上创建逻辑复制槽,以跟踪复制的状态。
  • 支持多个订阅者,并可以独立地控制每个订阅者的复制配置。
  • 可以选择性地复制某些表或特定列,而不是所有的数据。
  • 可以在订阅者上执行写操作并将其应用到发布者中。

要使用 PostgreSQL Subscriptions,您需要先配置一个发布者数据库,将需要复制的数据发布到订阅者- 数据库。然后在订阅者数据库中创建一个订阅,指定要复制的数据和其他复制配置。一旦订阅创建成功,发布者会将更改推送到订阅者,并且订阅者会将这些更改应用到其本地数据库中。

总而言之,PostgreSQL Subscriptions 是一种强大的复制机制,它在数据库之间提供了可靠的异步数据复制,使您能够将数据保持同步并实现高可用性和灵活性。

语言(Languages)

PostgreSQL主要是用C语言编写的。但是,它还支持用于开发数据库函数和扩展的各种其他编程语言。PostgreSQL支持的一些语言包括:

  • PL/pgSQL: PostgreSQL的原生过程语言,类似于Oracle的PL/SQL。
  • PL/Python:允许使用Python编程语言编写数据库函数和存储过程。
  • PL/Perl:允许使用Perl编程语言编写数据库函数和存储过程。
  • PL/Tcl:支持使用Tcl脚本语言编写数据库函数和存储过程。
  • PL/Java:允许使用Java编程语言编写数据库函数和存储过程。
  • PL/R:支持R语言与PostgreSQL的集成,用于统计分析。
  • PL/sh:支持使用shell脚本编写数据库函数和存储过程。

这些语言为PostgreSQL提供了灵活性和可扩展性,允许开发人员用他们喜欢的编程语言编写自定义函数和过程。

文章来源:https://blog.csdn.net/sinat_36528886/article/details/135043177
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。