模型没有图数据库的递归关系

时间:2014-08-16 12:09:21

标签: sql postgresql database-design

我们使用Postgres作为我们的数据库。现在有一个新的要求来建模关系,如跟随。虽然它似乎非常适合图形数据库,但是没有使用图形数据库的余地,因为postgres已经在此应用程序中用作数据库平台。

在关系设计中对此进行建模的最佳方法是什么,以避免递归的自连接,这将导致大型递归树的可怕查询性能。 -

查询要求是显示John Doe关系树以及其中每个相关成员的关系树。

请注意,以下示例仅用于说明目的,但实际用例涉及非常深的此类递归关系。

{
"personId" : 1,
"name" : "John Doe",
"relationships": {
  "cousineOf" : 23 //23 is a personId in the same table. say 23 is "Merry",
  "fatherOf" : 3 //where 3 is a personId with name - "George",
  "brotherOf" : 67 //where 67 is a personId with name - "Tony"

 }
}

1 个答案:

答案 0 :(得分:0)

这就是设计架构的方法:

create table people (
  person_id int primary key,
  name text not null
);

create table relationships (
  from_person_id int references people(person_id),
  type text, --link to foreign table in real life
  to_person_id int references people(person_id),

  primary key (from_person_id, type, to_person_id)
);

示例数据:

insert into people values
(1, 'John Doe'),
(23, 'Merry'),
(2, 'George'),
(67, 'Tony');

insert into relationships values
(1, 'cousinOf', 23),
(1, 'fatherOf', 6),
(1, 'brotherOf', 67);

请告诉我们您要对数据执行的操作。一些tree and path examples使用PostgreSQL递归CTE。

How does a Recursive CTE run, line by line?