Postgres中的多对多?

时间:2016-03-08 00:32:23

标签: postgresql ordbms

我使用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的更清晰的面向对象方法。

2 个答案:

答案 0 :(得分:1)

我担心你确实错误地使用PostgreSQL,并且可能误解了对象关系数据库的目的而不是传统的关系数据库。这两类数据库本质上仍然是关系型的,但前者提供了继承和用户定义类型的限制,而后者则没有。

This answer您之前的一个问题为您提供了一些很好的指示,可以帮助您实现使用Postgres模式尝试的功能。

答案 1 :(得分: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)
)
;

忽略这样一个事实,即人员表完全没有办法防止重复的人(错误拼写,中间名首字母,间距,敬意等等?还有两个不同的人可以有相同的名字),这将做你想要的并允许一个列出所有朋友的简单查询。