Re: How to represent a bi-directional list in db?

From: Pankaj Jangid <pankaj(dot)jangid(at)gmail(dot)com>
To: Francisco Olarte <folarte(at)peoplecall(dot)com>
Cc: Pankaj Jangid <pankaj(dot)jangid(at)gmail(dot)com>, "pgsql-generallists(dot)postgresql(dot)org" <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: Re: How to represent a bi-directional list in db?
Date: 2019-09-23 02:07:22
Message-ID: m2lfufhijp.fsf@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Francisco Olarte <folarte(at)peoplecall(dot)com> writes:

> On Sun, Sep 22, 2019 at 4:25 PM Pankaj Jangid <pankaj(dot)jangid(at)gmail(dot)com> wrote:
>> CREATE TABLE stages (
>> id SERIAL PRIMARY KEY,
>> name VARCHAR(80) NOT NULL,
>> created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
>> updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
>> prev_stage_id SERIAL REFERENCES stages NULL,
>> next_stage_id SERIAL REFERENCES stages NULL,
>> process_id SERIAL REFERENCES processes NOT NULL
>> );
>> Failed with: conflicting NULL/NOT NULL declarations for column
>> "prev_stage_id" of table "stages"
>> Is it not possible to create "nullable" self referencing foreign keys?
>
> Serial seems wrong. It means integer, not null, defaul next value from
> a sequence.
>
> What you probably want is just "prev_stage_id INTEGER" ( NULL by
> default ), as you do not want the prev/next stage ids to be generated,
> you normally would want to assign values from other tuples.
>

Thanks. This resolved my problem of NULL/NOT NULL conflict. I wasn't
aware that SERIAL is by default NOT NULL.

> Also, you may have problems populating this kind of table, as you will
> not have the ids from either prev or next stage when building it.
>

If NULL value is allowed I can fill it up with NULL initially. Right? Or
is there something wrong here.

> And lastly, in SQL you do not really need a doubly linked list, just
> populate prev_stage_id, and index it and you can query next stage of a
> tuple using it.
>

Could you please elaborate? Suppose I have this table,

CREATE TABLE stages (
id SERIAL PRIMARY KEY,
name VARCHAR(80) NOT NULL,
next_id INTEGER REFERENCE stages NULL,
);

What would be the backward query in that case? Forward is clear. This is
forward query,

SELECT name FROM stages WHERE next_id = 123;

--
Pankaj Jangid

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Shital A 2019-09-23 06:04:15 Re: Help: Postgres Replication issues with pacemaker
Previous Message Tom Lane 2019-09-22 21:55:56 Re: When does Postgres use binary I/O?