ORDBMS主要是指支持某些面向对象特性的关系型数据库。
PostgreSQL或Postgres(不是PostGres)支持表继承和函数重载。这两个功能通常被归属为面向对象语言的特性。
其中一个体现面向对象方法的情况是,每个表都有一个对应的数据类型创建。因此,一个表实质上是一个特定类型的"实例"集合。
您甚至可以明确地定义这样一张表:
create type person_type as (id integer, firstname text, lastname text);
create table person of person_type;
类型继承仅适用于表类型,而不适用于基本类型:
create table person (id integer, firstname text, lastname text);
create table person_with_dob
(
dob date
) inherits (person);
然而,这并不是完全面向对象的,因为类型定义缺乏在类型(=类)上定义方法(包括方法可见性)的能力。最接近类型方法的东西是一个以该类型作为参数的函数:
create table person (id integer, firstname text, lastname text);
create function fullname(p_row person) returns text
as
$$
select concat_ws(' ', p_row.firstname, p_row.lastname);
$$
language sql;
insert into person (id, firstname, lastname) values (42, 'Arthur', 'Dent');
现在您可以运行:
select p.fullname
from person p;
并且它返回:
fullname
-----------
Arthur Dent
尽管表person中没有名为fullname
的列,但这种行为最接近面向对象语言中真正的类/类型方法(但它并不完全相同,因为它仍然缺乏定义例如私有方法的能力)。
create type address_type (city text, zipcode text, street text);
create table person
(
id integer primary key,
firstname text,
lastname text,
billing_address address_type,
shipping_address address_type
);
数组也可以被看作是“一组对象”,然而这并不一定是面向对象的特征。