我使用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的更清晰的面向对象方法。
答案 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)
)
;
忽略这样一个事实,即人员表完全没有办法防止重复的人(错误拼写,中间名首字母,间距,敬意等等?还有两个不同的人可以有相同的名字),这将做你想要的并允许一个列出所有朋友的简单查询。