PostgreSQL 官方宣稱它是世界上最先進(jìn)的開源對象-關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(ORDBMS)。相信大家對于關(guān)系型數(shù)據(jù)庫并不陌生,它基于關(guān)系模型(由行和列組成的二維表),定義了完整性約束并且使用 SQL 作為操作語言。
不過今天我們的主題不是關(guān)系模型,而是 PostgreSQL 提供的面向?qū)ο筇匦浴C嫦驅(qū)ο缶幊蹋∣OP)的三大特性包括數(shù)據(jù)封裝、繼承和多態(tài),那么 PostgreSQL 作為對象-關(guān)系型數(shù)據(jù)庫,有哪些面向?qū)ο蟮奶匦泽w現(xiàn)呢?
封裝
OOP 將同類對象(Instance)封裝成類(Class),并且提供方法保護(hù)數(shù)據(jù)的訪問。例如以下 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 方法提供數(shù)據(jù)訪問。
PostgreSQL 作為數(shù)據(jù)庫,目的就是提供數(shù)據(jù)的存儲和訪問,其中的關(guān)系(表、索引、序列、視圖、復(fù)合類型等)對應(yīng)類,數(shù)據(jù)行對應(yīng)對象,字段對應(yīng)對象的屬性。例如:
CREATE TABLE animal(id integer, name varchar);
INSERT INTO animal(id, name) VALUES (1, '大黃');
SELECT id, name FROM animal;
PostgreSQL 使用 SQL 訪問表中的數(shù)據(jù),不同之處在于表中的字段都是 Public 屬性。如果需要實(shí)現(xiàn)數(shù)據(jù)的隱藏,可以通過表的訪問權(quán)限控制,或者利用存儲過程提供數(shù)據(jù)訪問方法。
PostgreSQL 提供了一個系統(tǒng)表 pg_class,存儲了關(guān)于表、索引、序列、視圖、復(fù)合類型等的元數(shù)據(jù)。
以下是一個空類,沒有任何屬性和方法:
class EmptyClass{
}
與此類似,PostgreSQL 可以定義沒有任何字段的空表:
CREATE TABLE empty_table();
另外,PostgreSQL 不僅支持復(fù)雜的數(shù)據(jù)類型,例如幾何、網(wǎng)絡(luò)、數(shù)組、范圍、XML、JSON 等,而且可以創(chuàng)建自定義的擴(kuò)展類型。下面是一個自定義復(fù)合類型作為字段類型的示例:
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 通過繼承讓子類復(fù)用父類的數(shù)據(jù)和行為,從而實(shí)現(xiàn)代碼的重用。例如:
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);
數(shù)據(jù)表 cat 繼承了數(shù)據(jù)表 animal,并且增加了額外的字段。
PostgreSQL 支持多繼承,子表可以繼承多個父表。
多態(tài)
OOP 另一個重要的特性是多態(tài),它可以在運(yùn)行時(shí)根據(jù)對象的實(shí)際類型來調(diào)用相應(yīng)的方法。例如:
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 的實(shí)際類型為 Cat,調(diào)用 eat() 方法時(shí),運(yùn)行的是 Cat.eat(),而不是 Animal.eat()。
-- 查詢?nèi)縿游?/span>
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 函數(shù)也支持重載(Overloading),也就是相同的函數(shù)名具有不同的函數(shù)參數(shù)。例如:
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 編輯過