pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Jerome Alet <alet@librelogiciel.com>
To: Josh Berkus <josh@agliodbs.com>
Cc: pgsql-sql@postgresql.org
Subject: Re: avoid circular references
Date: Thu, 6 Nov 2003 07:18:07 +0100
Message-ID: <20031106061807.GF17294@mail.librelogiciel.com> (raw)
In-Reply-To: <200311052115.39330.josh@agliodbs.com>
References: <20031105214041.GC13937@mail.librelogiciel.com>
	<200311052115.39330.josh@agliodbs.com>

On Wed, Nov 05, 2003 at 09:15:39PM -0800, Josh Berkus wrote:
> Jerome,
> 
> > Each object can contain one or many other objects from the same
> > table, so I guess this relationship can be expressed with something
> > like :
> 
> This is called a "tree structure".

Thanks !

> >   CREATE TABLE contains (id SERIAL PRIMARY KEY NOT NULL,
> >     containerid INTEGER REFERENCES objtable(idobj),
> >       contentid INTEGER REFERENCES objtable(idobj) );
> 
> This is overcomplicating things, unless a single object can belong to multiple 
> containers, which would strike me as peculiar.  Easier just to have a 
> "containerid" in the objtable, which is your basic Proximity List.
> 
> But of course, maybe I'm not understanding you and you do have multiple 
> inheritance.

Yes an object could theorically belong to multiple containers, so
that's not really a tree I suppose.

> > What I would like is to be able to avoid circular references :
> >
> >         - an object can't contain itself.
> >
> >         - an object can't contain one of its containers.
> >
> > So I'd like to know how to create additionnal integrity constraints
> > to solve this problem, and especially what syntax I should use.
> 
> Best to use some kind of recursive function.  I do this for a calendaring 
> setup with event templates, where events can have multiple (possible) parents 
> and multiple children.  Just write a pl/pgSQL function which reverse-traces 
> the parentage of the new object, looking for copies of itself.

Any example for this, especially on how to raise an integrity 
exception ? 

> > I thought about creating a rule but maybe the best is a trigger
> > (I'm not sure I really understand the difference) if I see
> > what happens when I create new tables. But what can I do in
> > my trigger to have PostgreSQL understand there's an integrity
> > violation ?
> 
> A trigger.   Just use a BEFORE trigger and raise an exception if a self-parent 
> is found.

Thanks for your help !

Jerome Alet
-- 
"A non-free program is a predatory social system that keeps people 
in a state of domination and division, and uses the spoils to 
dominate more." - RMS



view thread (3+ messages)

Message-ID: <20031106061807.GF17294@mail.librelogiciel.com>
Permalink:  ../20031106061807.GF17294@mail.librelogiciel.com/
Also on:    postgresql.org/message-id/20031106061807.GF17294@mail.librelogiciel.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: alet@librelogiciel.com, josh@agliodbs.com
  Subject: Re: avoid circular references
  In-Reply-To: <20031106061807.GF17294@mail.librelogiciel.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox