为什么说PostgreSQL是面向对象的数据库?

PostgreSQL 官方宣称它是世界上最先进的开源对象-关系型数据库管理系统(ORDBMS)。相信大家对于关系型数据库并不陌生,它基于关系模型(由行和列组成的二维表),定义了完整性约束并且使用 SQL 作为操作语言。

不过今天我们的主题不是关系模型,而是 PostgreSQL 提供的面向对象特性。面向对象编程(OOP)的三大特性包括数据封装、继承和多态,那么 PostgreSQL 作为对象-关系型数据库,有哪些面向对象的特性体现呢?

封装

OOP 将同类对象(Instance)封装成类(Class),并且提供方法保护数据的访问。例如以下 Java 示例:

public class Main {public static void main(String[] args) {Person animal = new Animal();animal.setId(1);animal.setName("大黄");System.out.println(animal.getId() + ", " + animal.getName());}
}class Animal{private Integer id;private String name;public void setId(Integer id){this.id = id;}public String getId(){return this.id;}public void setName(String name){this.name = name;}public Integer getname(){return this.name;}public void eat() {  System.out.println("The animal eats.");  } 
}

其中,Animal 是一个类,包含 id 和 name 属性,并且通过 getter 和 setter 方法提供数据访问。

PostgreSQL 作为数据库,目的就是提供数据的存储和访问,其中的关系(表、索引、序列、视图、复合类型等)对应类,数据行对应对象,字段对应对象的属性。例如:

CREATE TABLE animal(id integer, name varchar);INSERT INTO animal(id, name) VALUES (1, '大黄');SELECT id, name FROM animal;

PostgreSQL 使用 SQL 访问表中的数据,不同之处在于表中的字段都是 Public 属性。如果需要实现数据的隐藏,可以通过表的访问权限控制,或者利用存储过程提供数据访问方法。

PostgreSQL 提供了一个系统表 pg_class,存储了关于表、索引、序列、视图、复合类型等的元数据。

以下是一个空类,没有任何属性和方法:

class EmptyClass{
}

与此类似,PostgreSQL 可以定义没有任何字段的空表:

CREATE TABLE empty_table();

另外,PostgreSQL 不仅支持复杂的数据类型,例如几何、网络、数组、范围、XML、JSON 等,而且可以创建自定义的扩展类型。下面是一个自定义复合类型作为字段类型的示例:

CREATE TYPE people AS (id integer, name varchar);CREATE TABLE emp(p people);
INSERT INTO emp(p) VALUES ((1,'who'));SELECT (p).id, (p).name FROM emp;id|name|
--+----+1|who |

继承

OOP 通过继承让子类复用父类的数据和行为,从而实现代码的重用。例如:

public class Cat extends Animal {  private Integer legs;@Overridepublic void eat() {// 覆盖父类的方法System.out.println("The cat eats.");}...
}

其中,Cat 类继承了 Animal 类,可以拥有额外的属性和方法。

PostgreSQL 同样支持表的继承,例如:

CREATE TABLE cat(legs integer) INHERITS (animal);INSERT INTO cat(id, name, legs) VALUES (2, '橘猫', 4);

数据表 cat 继承了数据表 animal,并且增加了额外的字段。

PostgreSQL 支持多继承,子表可以继承多个父表。

多态

OOP 另一个重要的特性是多态,它可以在运行时根据对象的实际类型来调用相应的方法。例如:

public class Main {  public static void main(String[] args) {Animal animal1 = new Animal();  animal.eat(); // 输出 "The animal eats."  Animal animal2 = new Cat();  animal2.eat(); // 输出 "The cat eats."}  
}

其中,animal2 的实际类型为 Cat,调用 eat() 方法时,运行的是 Cat.eat(),而不是 Animal.eat()。

-- 查询全部动物
SELECT id, name FROM animal;id|name|
--+----+1|大黄 |2|橘猫 |-- 只查询animal
SELECT id, name FROM ONLY animal;
id|name|
--+----+1|大黄 |-- 只查询猫科动物
SELECT id, name FROM cat;id|name|
--+----+2|橘猫 |

另外,PostgreSQL 函数也支持重载(Overloading),也就是相同的函数名具有不同的函数参数。例如:

CREATE OR REPLACE FUNCTION add2(p1 integer, p2 integer)RETURNS integer 
AS $$
BEGINreturn p1+p2;
END; $$
LANGUAGE plpgsql;CREATE OR REPLACE FUNCTION add2(p1 numeric, p2 numeric)RETURNS numeric 
AS $$
BEGINreturn p1+p2;
END; $$
LANGUAGE plpgsql;

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

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

相关文章

C++之职工管理系统

1、管理系统需求 职工管理系统可以用来管理公司内所有员工的信息 主要利用C来实现一个基于多态的职工管理系统 公司中职工分为三类:普通员工、经理、老板,显示信息时,需要显示职工编号、职工姓名、职工岗位、以及职责。 普通员工职责:完成经理交给的…

自己写的whoami

一、代码 #include<stdio.h> #include<stdlib.h> #include<proc/readproc.h> int main() {struct PROCTAB *pt;struct proc_t *p;char *cmd;ptmalloc(sizeof(struct PROCTAB));pmalloc(sizeof(struct proc_t));ptopenproc(0x0028);while(readproc(pt,p)!NUL…

手撸dynamic源码详细讲解

本文源码解析基于3.3.1版本。只截了重点代码&#xff0c;如果需要看完整代码&#xff0c;可以去github拉取。 1 自动配置的实现 一般情况下&#xff0c;一个starter的最好入手点就是自动配置类&#xff0c;在 META-INF/spring.factories文件中指定自动配置类入口 org.spring…

CentOS无法解析部分网站(域名)

我正在安装helm软件&#xff0c;参考官方文档&#xff0c;要求下载 get-helm-3 这个文件。 但是我执行该条命令后&#xff0c;报错 连接被拒绝&#xff1a; curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 # curl: (7) Fai…

【linux升级gcc版本教程】

1下载gcc新版本 因为从浏览器下载比较慢&#xff0c;所以直接在服务器下载 cd /opt/soft目录 wget https://ftp.gnu.org/gnu/gcc/gcc-10.1.0/gcc-10.1.0.tar.gz #解压 tar -zvxf gcc-10.1.0.tar.gz --directory/usr/local/2下载gcc需要的依赖 1&#xff09;以下同样在服务器中…

python面向对象思想

面向对象思想是一种程序设计的范式&#xff0c;它以对象作为程序的基本单元&#xff0c;对象包含数据和方法。在Python中&#xff0c;一切皆为对象&#xff0c;包括数字、字符串、函数等。以下是一些关于Python面向对象编程&#xff08;OOP&#xff09;的基本概念&#xff1a; …

SpringBoot创建拦截器Interceptor以及过滤器Filter

SpringBoot创建拦截器Interceptor以及过滤器Filter 过滤器的创建 1、创建自定义的过滤器类&#xff0c;实现javax.servlet.Filter接口&#xff0c;重新doFilter方法&#xff0c;实现自定义逻辑&#xff0c;并放行 public class MyFilter implements Filter{Overridepublic voi…

Java SE入门及基础(39)

目录 异常处理 1. 如何处理异常 2. throw 抛出异常 语法 示例 3. throws 声明可能抛出的异常类型 语法 示例 4. try-catch 捕获异常 语法 示例 思考&#xff1a;如果一个方法可能抛出多个异常&#xff0c;如何捕获&#xff1f; 示例 5. finally 语句 语法 示例…

使用 pg_profile 在 Postgres 中生成性能分析报告

前言&#xff1a; postgres数据库中拥有大量的辅助插件用于帮助DBA更好的分析数据库性能或整个集群&#xff0c;包括索引、I/O、CPU和内存等&#xff0c;pg_profile是基于PostgreSQL标准统计信息视图的诊断工具&#xff0c;它类似于Oracle AWR架构&#xff0c;和Oracle一样&am…

threejs简单创建一个几何体(一)

1.下包引入 //下包 npm install three yarn add three//引入 import * as THREE from three2.创建场景,摄像机 // 1.创建场景const scene new THREE.Scene()// 2.创建摄像机//第一个参数是视角,一般在60-90之间,第二个参数是场景的尺寸,一般取显示器的宽高,第三个参数是开始位…

下载chromedrive,使用自动化

1、先看一下自己浏览器的版本 2、访问 https://googlechromelabs.github.io/chrome-for-testing/

Avalonia之ListBox模版设置

最近在使用Avalonia进行开发的时候发现好多用法还是和Wpf有很大的区别,尤其是在WPF使用习惯了Style.Triggs时候,好多之前的想法和方案需要进行转变。Avalonia的样式控制更倾向于Html里面的样式控制。今天将自己在移植过程中的过程做一个记录,方便后续查漏补缺: <UserCon…

通信信号IQ数据处理

在当今的数字通信领域&#xff0c;IQ信号数据的处理、信号识别以及数据解析是确保信息准确传输和接收的关键环节。IQ信号&#xff0c;即正交幅度调制信号&#xff0c;包含了载波信号的幅度和相位信息&#xff0c;是现代无线通信系统中不可或缺的一部分。本文将深入探讨IQ信号数…

射影几何 -- 摄像机几何 1

三维计算机视觉的主要任务是利用三维物体的二维图像所包含的信息&#xff0c;获取三维物体的空间位置与形状等几何信息&#xff0c;并在此基础上识别三维物体。 摄像机关于空间平面的投影是平面到平面的一个二维中心投影变换 对于空间物体&#xff0c;由于摄像机将三维物体表面…

单例模式( Singleton)——创建型模式

单例模式——创建型模式 什么是单例模式&#xff1f; 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。简单来说如果你创建了一个对象&#xff0c; 过一会儿后你决定再创建一个新对象&#xff0c; 此…

中国京津冀太阳能光伏推进大会暨展览会

能源是国民经济发展的重要基础之一。随着国民经济的发展&#xff0c;能源的缺口增大&#xff0c;能源安全及能源在国民经济中的地位越显突出。我国是世界上少数几个能源结构以煤为INVITATION主的国家之一&#xff0c;也是世界上最大的煤炭消费国&#xff0c;燃煤造成的环境污染…

Linux操作系统——常见指令(1)

今天分享一下Linux操作系统常见一些指令。今天介绍 ls pwd cd touch mkdir rmdir rm这几个指令。 ls指令 语法 ls 选项 目录或者文件 功能 对于目录&#xff0c;该命令列出该目录下的所有子目录和文件&#xff0c;对于文件&#xff0c;将列出文件名以及其他信息。 我们常用…

【单调栈】代码随想录算法训练营第六十天 |84.柱状图中最大的矩形(待补充)

84.柱状图中最大的矩形 1、题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱…

24计算机考研调剂 | 长江大学石油工程学院

长江大学石油工程学院接收调剂研究生 考研调剂招生信息 学校:长江大学 专业:工学->石油与天然气工程->油气田开发工程 年级:2024 招生人数:2 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP查看) 补充内容 长江大学武汉校区石油工程学…

20240314-前缀和

基本推导公式 因此得出二维前缀和预处理公式 s[i][j] s[i - 1][j] s[i][j - 1 ] a[i] [j] - s[i - 1][j - 1] 因此二维前缀和的结论为&#xff1a; 以(x1, y1)为左上角&#xff0c;(x2, y2)为右下角的子矩阵的和为&#xff1a; s[x2, y2] - s[x1 - 1, y2] - s[x2, y1 - 1]…