two table foreign keys - Mailing list pgsql-general

From Miles Elam
Subject two table foreign keys
Date
Msg-id aqelj7$412$1@news.hub.org
Whole thread Raw
Responses Re: two table foreign keys
Re: two table foreign keys
List pgsql-general
I have a database schema that has two tables with mutual dependency.

Basically:

local_users
   id
   default_group
   (...bunch of other columns...)


local_groups
   id
   ownerid
   (..other columns...)


local_users.default_group references local_groups.id
local_groups.ownerid references local_users.id

The SQL was a bit...disconcerting.  I have trimmed the example for brevity.

---------------------------------------

CREATE TABLE "lusers" (
    "id" serial NOT NULL,
         "defaultGroup" integer NOT NULL,
    Constraint "luser_pkey" Primary Key ("id")
);

CREATE TABLE "lgroups" (
    "id" serial NOT NULL,
    "ownerID" integer NOT NULL REFERENCES "lusers" DEFERRABLE ON UPDATE
CASCADE,
    Constraint "lgroups_pkey" Primary Key ("id")
);

CREATE CONSTRAINT TRIGGER "<unnamed>" AFTER INSERT OR UPDATE ON "lusers"
FROM "lgroups" DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE
PROCEDURE "RI_FKey_check_ins" ('<unnamed>', 'lusers', 'lgroups',
'UNSPECIFIED', 'defaultGroup', 'id');

CREATE CONSTRAINT TRIGGER "<unnamed>" AFTER DELETE ON "lgroups" FROM
"lusers" DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE
"RI_FKey_noaction_del" ('<unnamed>', 'lusers', 'lgroups', 'UNSPECIFIED',
'defaultGroup', 'id');

CREATE CONSTRAINT TRIGGER "<unnamed>" AFTER UPDATE ON "lgroups" FROM
"lusers" DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE
"RI_FKey_noaction_upd" ('<unnamed>', 'lusers', 'lgroups', 'UNSPECIFIED',
'defaultGroup', 'id');

-------------------------------------

There are other tables as well, but for now, I'll stick with this one.
My intent is to be somewhat like UNIX permissions and current configs
where users have a default, private group.  I don't want to give up
foreign key constraints though as every user is expected to have a
default group and every group must have an owner (someone who controls
private group creation/modification/deletion).  I would have preferred
simple references syntax on the lusers table, but since the lgroups
table did not yet exist, this is what I came up with.

Two issues: Am I doing something for which PostgreSQL was not designed
(mutual table references)?  Will it affect pg_dump/pg_restore?

Is it acceptable that INSERTs be done by simply setting constraints to
deferred and performing the INSERTS/stored procedure in a transaction?
Would I be better served by making a ¨nobody¨ group and user to be used
as a temporary?

When I am backing up and restoring the database, are constraints checked
after every COPY statement into a database (which would fail) or after
all data has been imported (which would succeed)?

- Miles


pgsql-general by date:

Previous
From: Fredrick Paul Eisele
Date:
Subject: Configuring postgresql build to handle long names
Next
From: Stephane Tessier
Date:
Subject: Re: table growing