X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.2]) by svr1.postgresql.org (Postfix) with ESMTP id B0D3AD1B4F4 for ; Thu, 6 Nov 2003 06:18:42 +0000 (GMT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (neptune.hub.org [200.46.204.2]) (amavisd-new, port 10024) with ESMTP id 08095-09 for ; Thu, 6 Nov 2003 02:18:12 -0400 (AST) Received: from nordine.ateur (main.librelogiciel.com [62.212.108.58]) by svr1.postgresql.org (Postfix) with ESMTP id 44BCFD1BB5F for ; Thu, 6 Nov 2003 02:18:11 -0400 (AST) Received: from jerome by nordine.ateur with local (Exim 3.36 #1 (Debian)) id 1AHdT5-0004WX-00; Thu, 06 Nov 2003 07:18:07 +0100 Date: Thu, 6 Nov 2003 07:18:07 +0100 To: Josh Berkus Cc: pgsql-sql@postgresql.org Subject: Re: avoid circular references Message-ID: <20031106061807.GF17294@mail.librelogiciel.com> References: <20031105214041.GC13937@mail.librelogiciel.com> <200311052115.39330.josh@agliodbs.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200311052115.39330.josh@agliodbs.com> User-Agent: Mutt/1.5.4i From: Jerome Alet X-Virus-Scanned: by amavisd-new at postgresql.org X-Archive-Number: 200311/34 X-Sequence-Number: 15849 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