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

From: Francisco Olarte <folarte(at)peoplecall(dot)com>
To: Pankaj Jangid <pankaj(dot)jangid(at)gmail(dot)com>
Cc: "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-22 15:39:11
Message-ID: CA+bJJbzL4Z64TTPpaiAdTBnuTCqnpcjft=PiNrd3NiyQ8Edf1w@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Pankaj:

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.

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.

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.

Francisco Olarte.

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Adrian Klaver 2019-09-22 16:18:30 Re: Extend inner join to fetch not yet connected rows also
Previous Message Pankaj Jangid 2019-09-22 14:25:00 How to represent a bi-directional list in db?