Re: Unintuitive behavior regarding inheritance - Mailing list pgsql-general

From Chris Travers
Subject Re: Unintuitive behavior regarding inheritance
Date
Msg-id CAKt_ZftoXxomziJxCiQG-nbLssNYGyHWCdjW47=Fwib3=q=UMQ@mail.gmail.com
Whole thread Raw
In response to Re: Unintuitive behavior regarding inheritance  (David Johnston <polobo@yahoo.com>)
Responses Re: Unintuitive behavior regarding inheritance
List pgsql-general
Ok

So what I am trying to do is:

1)  Paritioned tables
2)  Joins against the table partitions

The way I have this done is:

The first table is partitioned on the basis of one part of the primary
key.  So in theory since nobody has permission to insert into the base
table, all records should have unique primary keys in the inheritance
tree.  The join table against the partition table is more complex and
I had to partition it across two pieces of the primary key.  To be
clear I am joining a partitioned table against a partitioned table
(since that seems to be the only sane way of joining against a
partitioned table if referential integrity has to be enforced.

Basically imagine the following (the actual schema is quite a bit more complex):

create table invoice ( id serial primary key,
reference text,
....
);

create table order (id serial primary key,
reference text,
....
);

create table file_class ( id serial not null unique,
label text primary key
);

create table file_attachment (
id serial not null unique,
file_class int references file_class(id),
ref_key int,
file_name text,
primary key(file_class, ref_key, file_name)
);

create table invoice_attachment (
check (file_class = 1),
foreign key(ref_key) references invoice(id),
) inherits (file_attachment);

create table order_attachment (
check(file_class = 2),
foreign key (ref_key) references order(id),
) inherits (file_attachment);

create table order_to_invoice_file_map(
src_class int references invoice_attachment(id),
dest_class int references order_attachment(id),
file_id int references order_attachment(id),
....
); -- this is actually inherited in my schema too

It seems for this to work all primary and foreign key constraints have
to be redeclared on each child table.  OTOH check constraints are
additive.

The idea here is to provide a system where by a consistent relational
interface is provided for file attachments, and where neither higher
levels of the application nor pieces of the model have to be aware of
the existance or not of partitions.  Ideally given the fact that each
child table constrains part of the primary key to a reserved set of
values means I shouldn't have to worry about primary key collision
across the inheritance tree.  Unfortunately, it seems that to do this
a lot of copy/paste is required.

The major drawback with this approach is that since check constraints
are always inherited they can't be used to enforce the idea that base
tables should have no rows.  At the same time, since unique
constraints are never inherited they have to be redeclared on every
child.

I recognize that one of the big hurdles here is the need sometimes to
drop indexes while loading data.... but at the same time there are
several places where this sort of thing has been overlooked so far by
people far more knowledgeable about PostgreSQL than I am.

Hope this helps.
Chris Travers

pgsql-general by date:

Previous
From: David Johnston
Date:
Subject: Re: Unintuitive behavior regarding inheritance
Next
From: David Johnston
Date:
Subject: Re: Unintuitive behavior regarding inheritance