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

这篇具有很好参考价值的文章主要介绍了为什么说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;
    
    @Override
    public 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),也就是相同的函数名具有不同的函数参数。例如:文章来源地址https://www.toymoban.com/news/detail-843369.html

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

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

到了这里,关于为什么说PostgreSQL是面向对象的数据库?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 说说为什么要做数据库拆分

    单体项目在构建之初,数据库的负载和数据量都不大,所以不需要对数据库做拆分,小型财务系统、文书系统、ERP系统、OA系统,用一个MySQL数据库实例基本就够用了。 就像《淘宝技术这十年》里面说到的,电商业务的数据量增长飞快,所以最开始的PHP+MySQL的架构已经不能满

    2024年02月08日
    浏览(55)
  • Elasticsearch:什么是向量和向量存储数据库,我们为什么关心?

    Elasticsearch 从 7.3 版本开始支持向量搜索。从 8.0 开始支持带有 HNSW 的 ANN 向量搜索。目前 Elasticsearch 已经是全球下载量最多的向量数据库。它允许使用密集向量和向量比较来搜索文档。 向量搜索在人工智能和机器学习领域有许多重要的应用。 有效存储和检索向量的数据库对于

    2024年02月08日
    浏览(55)
  • 什么是 Java 中的数据库连接池?为什么使用连接池来管理数据库连接?

    数据库连接池(database connection pool)是在 Java 中用于管理数据库连接的一种技术。它的主要目的是提高数据库连接的重用性和性能。在传统的数据库连接方式中,每次与数据库建立连接时都需要进行一系列的网络通信和身份验证操作,这样的开销较大并且会影响应用程序的性

    2024年02月06日
    浏览(66)
  • 为什么数据库要允许没有主键的表存在

    在数据库设计中,主键是一个关键概念,用于唯一标识数据库表中的每一行数据。然而,有时候数据库允许没有主键的表存在的情况,这可能会引起一些争议和疑问。本文将探讨为什么数据库允许没有主键的表以及相关的考虑因素。 主键在数据库中具有以下作用: 唯一标识

    2024年02月08日
    浏览(72)
  • AIGC基础:大型语言模型 (LLM) 为什么使用向量数据库,嵌入(Embeddings)又是什么?

    嵌入: 它是指什么?嵌入是将数据(例如文本、图像或代码)转换为高维向量的数值表示。这些向量捕捉了数据点之间的语义含义和关系。可以将其理解为将复杂数据翻译成 LLM 可以理解的语言。 为什么有用?原始数据之间的相似性反映在高维空间中对应向量之间的距离上。

    2024年02月21日
    浏览(70)
  • 数据库——Redis 没有使用多线程?为什么不使用多线程?

    虽然说 Redis 是单线程模型,但是, 实际上, Redis 在 4.0 之后的版本中就已经加入了对多线程的支持。 不过,Redis 4.0 增加的多线程主要是针对一些大键值对的删除操作的命令,使用这些命令就会使用主处理之外的其他线程来“异步处理”。 大体上来说, Redis 6.0 之前主要还是

    2024年02月11日
    浏览(67)
  • 数据库为什么使用B+树而不是B树做索引

    🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于PHP专栏:MySQL的100个知识点。 🎉欢迎 👍点赞✍评论⭐收

    2024年02月10日
    浏览(49)
  • Facebook 用户量十分庞大,为什么还使用 MySQL 数据库?

    当谈到社交媒体巨头Facebook时,我们立刻想到的是其庞大的用户基础和每日海量的数据流。然而,您可能会惊讶地发现,尽管面对如此巨大的规模,Facebook 仍然选择使用 MySQL 数据库作为其核心的数据存储和管理系统。 为什么Facebook没有选择其他更强大或更高级的数据库系统?

    2024年02月04日
    浏览(52)
  • 为什么 AIGC 和大模型创业者都在安利向量数据库?

    从目前 VC 的投资数据来看,大家对 AI 的关注点主要有三个:一个是基础大模型 LLM,第二个是具体某个场景的应用(包括小模型),第三个就属基础模型与应用层之间的中间层了(开发者工具和数据库等)。 随着开发者疯狂涌入开发各种 AI 应用,中间层已经成为各大 VC 争抢

    2024年02月09日
    浏览(68)
  • mysql面试题30:什么是数据库连接池、应用程序和数据库建立连接的过程、为什么需要数据库连接池、你知道哪些数据库连接池

    该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 数据库连接池是一种用于管理和复用数据库连接的技术。它是在应用程序和数据库之间建立一组数据库连接,并以池的形式存储起来,每当应用程序需

    2024年02月07日
    浏览(60)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包