LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

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

admin
2024年3月15日 8:15 本文热度 324

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),也就是相同的函数名具有不同的函数参数。例如:

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;

该文章在 2024/3/15 14:49:17 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved