Re: exploiting features of pg to obtain polymorphism - Mailing list pgsql-general

From Ivan Sergio Borgonovo
Subject Re: exploiting features of pg to obtain polymorphism
Date
Msg-id 20061012164032.4b49ad2f@localhost
Whole thread Raw
In response to Re: exploiting features of pg to obtain polymorphism maintaining ref. integrity  (Karsten Hilbert <Karsten.Hilbert@gmx.net>)
Responses Re: exploiting features of pg to obtain polymorphism
List pgsql-general
Resending since it definitively seems it has been lost in outer spaces.
Sorry for duplicates if any.

On Sun, 8 Oct 2006 14:09:53 +0200
Karsten Hilbert <Karsten.Hilbert@gmx.net> wrote:

> On Fri, Oct 06, 2006 at 11:09:29PM +0200, Ivan Sergio Borgonovo
> wrote:
>
> > Is there any good documentation, example, tutorial, pamphlet,
> > discussion... to exploit pg features to obtain "polymorphic"
> > behavior without renouncing to referential integrity?
>
> In GNUmed we use it to aggregate text fields over a
> range of child tables and for auditing:
>
>  http://cvs.savannah.gnu.org/viewcvs/gnumed/gnumed/server/sql/?root=gnumed
>
> look at gmAudit*.sql and gmclinical.sql

I finally got the time to look at the files you suggested.
They helped me to realize that if I put pk/fk in the children I won't have inheritance problems on pk/fk cos they will
bepreserved. As stupid as this observation may seem, at least it tells me what I can do. 

Anyway it doesn't solve the problem of having lists that can contain different elements with same parent and maintain
ref.integrity. 

Now back to gm code.

I see you've data tables with their pk/fk relations and triggers in one schema that inherit from audit tables in
another.

You've a function that helps to put tables that have to be audited in another table, nothing special compared with an
insertwith the exception of some extra control on input. 

Audit tables have their own pk/fk relationships and their triggers but according to my knowledge they won't be
consideredunless you operate on those table directly. 
If you operate on the data tables those triggers pk/fk won't be seen.

Considering you forbid direct insert, update and delete on those tables, while pk/fk etc... are still a security net it
seemsthat those relationship will never be really used. 

Later on you grant the same operations to gm-doctors. This further puzzle me even if I've the suspect the code is not
completeenough to implement the features I'm expecting from the framework I see. 

Finally I read:
comment on table audit.audited_tables is
    'All tables that need standard auditing must be
     recorded in this table. Audit triggers will be
     generated automatically for all tables recorded
     here.';

But I can't see anything doing this.

There is one point of contact between what I did already and what I would like to do but I still haven't had a good
ideahow to implement it. The use of metadata. But definitively I can't see polymorphism in your use of inheritance. 

One way I could eg. make lists that can contain elements of different kind with same parent could be to have a simple
methodto add the missing (not inherited) ref. integrity triggers on children. 

Specifying pk/fk again on inherited fields of children seems to come with a lot of trouble and still will put me in the
samecondition of not having polymorphism (list of elements with common parent). Furthermore this won't solve the
problemthat declaration=instantiation in sql 
While inherits seems syntax sugar and maybe a way to avoid to add metadata to feed to a stored procedure I'll have to
protectthe parent class from being directly accessed (since most of the time the behavior of parents is unwelcome). 
So the only structure there is in pg that looks OO seems not used to support polymorphism in the way I'm interested, it
seemsmainly a way to avoid typing over and over the definition of some columns and to group tables. 

Actually if I could use inherits generated metadata (pg_inherits and Co.) that will come at the cost of having
instantiatedparent tables with their "real" relation with children. 

But there is no simpler syntax than defining a table to *define a table*, and there is no way I know to define virtual
tables.

Supposing I was able to create virtual parents I could add metadata to children, feed those metadata to sp to create
triggersto maintain ref. integrity in lists that contain different elements with same parent. 

Otherwise I'll have to have an external parser that start from pseudo sql where I can specify if a table is a virtual
tableetc... or put virtual table definitions inside tables to be fed to a sp... but this definitively looks overkill. 

The example here while suggestive
http://www.varlena.com/varlena/GeneralBits/98.php
doesn't seem to have any relation with OO and the second sentence explain it all:
"In the PostgreSQL implementation, this is not true object inheritance."

Any second chance to find an OO use of inherits, cos this seems the only OO construct of pg.

Don't take this as a sparkle of a flame war (we already had 2 very long one in few weeks) on how pg is /under .*/
etc...I'm not aware of any usable/mature rdbms with reasonable OO features. 


--
Ivan Sergio Borgonovo
http://www.webthatworks.it


pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: STABLE functions
Next
From: Andrew Sullivan
Date:
Subject: Re: STABLE functions