PostgreSQL作为ORDBMS的含义是什么?

20

查询 没有提供太多帮助。

此处所述,PostgreSQL是ORDBMS。

这里则解释了PostgreSQL是RDBMS。


PostgreSQL是ORDBMS是什么意思?这与支持用户定义的数据类型有关吗?


3
可能是 RDBMS 和 ORDBMS 的区别 的重复问题。 - user180100
1
@RC。我读了那个查询100遍。它只是一篇英语文学作品,没有任何帮助。那个查询有投票,但没有答案。我相信你从那个查询中得不到任何东西。 - overexchange
Postgres允许在查询中使用存储在JSON列中的JSON对象的属性。JSON数据列是一种复杂的数据类型,不再是关系型的,因此我认为这至少是它不再是纯粹关系型数据库的一个原因。 - t.niese
@t.niese,你的意思是ORDBMS是关于支持用户定义类型的数据库交流吗? - overexchange
JSON不是用户定义的类型,而是由数据库定义的类型。但是能够查询JSON对象中的数据并不是关系型数据库所匹配的功能,因为它是一种复杂的数据类型。这与类型是否由用户定义无关,而与类型的种类有关。 - t.niese
@t.niese 是的,PostGresSql 支持 JSON 类型。这与 PostGreSql 是 ORDBMS 有什么关系? - overexchange
1个回答

38

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
);

数组也可以被看作是“一组对象”,然而这并不一定是面向对象的特征。


  1. 如果我们谈论表继承和函数重载,那么面向对象数据库管理系统(OODBMS)与面向关系数据库管理系统(ORDBMS)有何不同?
  2. 在关系模型中,表代表一个数学关系。如果将表视为可以继承的对象,那么关系模型仍然适用吗?
- overexchange
@overexchange:一个纯面向对象的数据库不支持关系型特性,主要是因为它没有像SQL那样的查询语言。 - user330315

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接