Re: arc relationship [was: db design question] - Mailing list pgsql-novice

From Andrew McMillan
Subject Re: arc relationship [was: db design question]
Date
Msg-id 1035283265.6376.172.camel@kant.mcmillan.net.nz
Whole thread Raw
In response to arc relationship [was: db design question]  ("Jules Alberts" <jules.alberts@arbodienst-limburg.nl>)
Responses Re: arc relationship [was: db design question]
List pgsql-novice
On Tue, 2002-10-22 at 22:34, Jules Alberts wrote:
> That wouldn't solve my problem, because I want to be able to store more
> addresses per company / client / consultant. Also, I have other tables
> (action and blobs) that do the same.

Oh, I see.

Yes, the standard way to deal with this is a to 'normalise' the data
through intermediate tables.

In my past I have usually used an 'address_type' or 'contact_type' field
to additionally identify these relationships, but that is probably
irrelevant to this question.

Basic form is:

company ( company_id, company_data );
address ( address_id, address_data);
employee ( employee_id, employee_data );
company_address( company_id, address_id );
employee_address( employee_id, address_id );

However, if you can guarantee that company_id and employee_id are
non-colliding (e.g. you use the same sequence to generate them) then
company_address and employee_address can be combined into a single
table.

Alternatively, a defining attribute can be added to identify the source,
so you can have individual sequences within the source tables:

contact_address( contact_source, contact_id, address_id )

Where a 'contact_source' of 'E' might identify that contact_id is an
employee_id or 'C' might indicate a company_id and so on.


> I had a conversation with an Oracle DBA this morning. After explaining,
> which took some time :-), he told me that what I wanted is in Oracle
> called an "arc" relationship.

Yes.  I've heard them called other things too (polite ones, even :-).


> 4. same as 3., but in address / action / blobs also create a column
> that contains the name of the related table. This will makes a backward
> search (which is the company / client / consultant this address belongs
> to) easier.
>
> I think number 4 is the best solution. Create a sequence from which all
> tables get their primary key and include an integer row in address etc
> that points to the primary key of the related table and store the name
> of that table. Things to keep an eye on:
>
> - don't change table names without changing the values in address etc
> - set a huge maximum value for the global sequence

Note that the 'contact_source' can be anything you want - it doesn't
have to be the full table name from the source table.  It is probably
better if it isn't, in fact, because then you are restricted to a single
reference field in your source table.

Consider a company record that required two signatories to be recorded,
each with their address.  This could potentially (easily) be handled as
two fields on the company record, but you would need your
'contact_source' linking to their address to indicate not just the
table, but the field as well.  Usually it is easier to do this
symbolically, than to use the full table.field sort of notation (which
_still_ might not support arrays, or whatever).

Cheers,
                    Andrew.
--
---------------------------------------------------------------------
Andrew @ Catalyst .Net.NZ Ltd, PO Box 11-053, Manners St,  Wellington
WEB: http://catalyst.net.nz/         PHYS: Level 2, 150-154 Willis St
DDI: +64(4)916-7201     MOB: +64(21)635-694    OFFICE: +64(4)499-2267
           Survey for free with http://survey.net.nz/
---------------------------------------------------------------------


pgsql-novice by date:

Previous
From: "paul butler"
Date:
Subject: Re: Big Picture
Next
From: Tan ga
Date:
Subject: Trying to avoid double results