0

我选择了 PostgreSQL,因为它是 ORDMBS 而不是标准的关系 DBMS。我有一个想在数据库中实现的类/对象(如下)。

class User{
    int id;
    String name;
    ArrayList<User> friends;
}


现在,一个用户有很多朋友,所以,从逻辑上讲,表应该这样声明:

CREATE TABLE user_table(
    id        INT,
    name      TEXT,
    friends   TYPEOF(user_table)[]
)


但是,据我所知,不可能将表的一行用作类型(postgreSQL 为 -10 分),因此,我的朋友数组存储为整数:

CREATE TABLE user_table(
    id        INT,
    name      TEXT,
    friends   INT[]
)


这是一个问题,因为数组的元素不能引用——只有数组本身可以。除此之外,似乎没有办法在不进行多次查询的情况下导入整个用户(即用户和用户的所有朋友)。

我使用 postgreSQL 错了吗?在我看来,使用它的唯一有效方法是使用关系方法。

我想要一种类似于 Java 的更简洁的面向对象方法。

4

2 回答 2

1

恐怕您确实是错误地使用了 PostgreSQL,并且可能误解了对象关系数据库相对于经典关系数据库的目的。这两类数据库本质上仍然是关系型的,但前者允许继承和用户定义类型,而后者则没有。

对您之前的一个问题的回答为您提供了一些很好的指导,以实现您使用 Postgres 模式尝试做的事情。

于 2016-03-08T01:00:12.960 回答
0

好吧,首先,PostgreSQL 绝对支持您描述的复杂类型的数组(尽管我认为它没有 TYPEOF 运算符)。但是,您描述的声明将如何工作?您正在尝试在表的声明中使用表类型。如果您想要的是数组中的复合类型(我不确定是否如此),您可以分两步声明:

CREATE TYPE ima_type AS ( some_id integer, some_val text);

CREATE TABLE ima_table
( some_other_id serial NOT NULL
, friendz ima_type []
)
;

运行良好。您还可以创建表类型数组,因为每个表定义都是 Postgres 中的类型定义。

但是,在关系数据库中,更传统的模型将使用两个表:

CREATE TABLE persons
( person_id serial NOT NULL PRIMARY KEY
, person_name text NOT NULL
)
;
CREATE TABLE friend_lookup
( person_id integer FOREIGN KEY REFERENCES persons
, friend_id integer FOREIGN KEY REFERENCES persons(person_id)
, CONSTRAINT uq_person_friend UNIQUE (person_id, friend_id)
)
;

忽略persons表绝对没有办法防止重复人的事实(拼写错误,中间首字母,空格,敬语等呢?两个不同的人可以有相同的名字),这将做你想要的并允许列出所有朋友的简单查询。

于 2016-03-08T00:55:55.110 回答