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
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 |