Re: disjoint union types

From: Erik Jones <erik(at)myemma(dot)com>
To: Sam Mason <sam(at)samason(dot)me(dot)uk>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: disjoint union types
Date: 2007-10-09 15:30:15
Message-ID: 93C663B8-8AC6-4D96-978F-C50B22D275C0@myemma.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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(at)myemma(dot)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

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Scott Marlowe 2007-10-09 15:57:49 Re: slow request
Previous Message Dimitri Fontaine 2007-10-09 15:05:03 Re: DB upgrade