Re: disjoint union types - Mailing list pgsql-general

From Erik Jones
Subject Re: disjoint union types
Date
Msg-id 93C663B8-8AC6-4D96-978F-C50B22D275C0@myemma.com
Whole thread Raw
In response to disjoint union types  (Sam Mason <sam@samason.me.uk>)
Responses Re: disjoint union types  (Sam Mason <sam@samason.me.uk>)
List pgsql-general
On Oct 9, 2007, at 9:38 AM, Sam Mason wrote:

> Hi,
>
> I was after opinions as to the best way to lay tables out to get the
> effect of a "disjoint union" type (also known as a "tagged union").
> When I have to do this at the moment, I'm creating a structure like:
>
>   CREATE TABLE circle ( id SERIAL PRIMARY KEY, radius  REAL NOT
> NULL );
>   CREATE TABLE square ( id SERIAL PRIMARY KEY, sidelen REAL NOT
> NULL );
>
>   CREATE TABLE shapes (
>     id SERIAL PRIMARY KEY,
>
>     tag INTEGER NOT NULL,
>
>     circleid INTEGER REFERENCES circle
>       CHECK ((tag = 1) = (circleid IS NOT NULL)),
>     squareid INTEGER REFERENCES square
>       CHECK ((tag = 2) = (squareid IS NOT NULL))
>   );
>
> I can then put data into this by doing:
>
>   BEGIN;
>   INSERT INTO circle (radius) VALUES (1);
>   INSERT INTO shapes (tag,circleid) VALUES (1,currval
> ('circle_id_seq'));
>   COMMIT;
>
> This works, but it's sometimes a bit of a headache turning things
> around
> so they fit this structure.  Are there standard solutions to this that
> work better?

You could use after triggers on your circle and shape tables to
automatically make the insert into shapes for you.

Erik Jones

Software Developer | Emma®
erik@myemma.com
800.595.4401 or 615.292.5888
615.292.0777 (fax)

Emma helps organizations everywhere communicate & market in style.
Visit us online at http://www.myemma.com



pgsql-general by date:

Previous
From: Sam Mason
Date:
Subject: disjoint union types
Next
From: "Bima Djaloeis"
Date:
Subject: Re: starting a stored procedure+rule AFTER an insert