Thread: Join Table

Join Table

From
T E Schmitz
Date:
Hello,

I have created the following join table: the two FKs are the PK of the 
table. Typically, I will need to select rows for a given ITEM_FK.

Question: is it necessary/advisable to create an index for the ITEM_FK 
column? Or is this redundantbecause this column is already one of the PK 
columns?

CREATE TABLE SUPPLY
(
ITEM_FK integer NOT NULL,
CONTACT_FK integer NOT NULL,
COST numeric (7,2),
PRIMARY KEY (ITEM_FK,CONTACT_FK)
);


-- 


Regards/Gruß,

Tarlika Elisabeth Schmitz


Re: Join Table

From
Michael Fuhr
Date:
On Mon, Nov 01, 2004 at 04:34:32PM +0000, T E Schmitz wrote:
> 
> I have created the following join table: the two FKs are the PK of the 
> table. Typically, I will need to select rows for a given ITEM_FK.
> 
> Question: is it necessary/advisable to create an index for the ITEM_FK 
> column? Or is this redundantbecause this column is already one of the PK 
> columns?

Here's an excerpt from the documentation for CREATE TABLE:

"PostgreSQL automatically creates an index for each unique constraint
and primary key constraint to enforce the uniqueness.  Thus, it is
not necessary to create an explicit index for primary key columns."

However, read the "Multicolumn Indexes" section in the "Indexes"
chapter to be sure you understand when the index will be used and
when it won't be:

http://www.postgresql.org/docs/7.4/static/indexes-multicolumn.html

> CREATE TABLE SUPPLY
> (
> ITEM_FK integer NOT NULL,
> CONTACT_FK integer NOT NULL,
> COST numeric (7,2),
> PRIMARY KEY (ITEM_FK,CONTACT_FK)
> );

If ITEM_FK and CONTACT_FK are foreign keys, then you might want to
add foreign key constraints to ensure referential integrity.

-- 
Michael Fuhr
http://www.fuhr.org/~mfuhr/


Re: Join Table

From
Tom Lane
Date:
T E Schmitz <mailreg@numerixtechnology.de> writes:
> CREATE TABLE SUPPLY
> (
> ITEM_FK integer NOT NULL,
> CONTACT_FK integer NOT NULL,
> COST numeric (7,2),
> PRIMARY KEY (ITEM_FK,CONTACT_FK)
> );

> Question: is it necessary/advisable to create an index for the ITEM_FK 
> column? Or is this redundantbecause this column is already one of the PK 
> columns?

The PK index will be usable for searches on ITEM_FK alone (though *not*
for searches on CONTACT_FK alone --- a moment's thought about the index
sort order should convince you why).  It would be marginally less
efficient for this purpose than a dedicated index on ITEM_FK.  But unless
your use of this table is almost all searches and hardly any
modifications, adding a dedicated index is probably a net loss due to
the added update costs.
        regards, tom lane


Re: Join Table

From
Richard Huxton
Date:
T E Schmitz wrote:
> Hello,
> 
> I have created the following join table: the two FKs are the PK of the 
> table. Typically, I will need to select rows for a given ITEM_FK.
> 
> Question: is it necessary/advisable to create an index for the ITEM_FK 
> column? Or is this redundantbecause this column is already one of the PK 
> columns?
> 
> CREATE TABLE SUPPLY
> (
> ITEM_FK integer NOT NULL,
> CONTACT_FK integer NOT NULL,
> COST numeric (7,2),
> PRIMARY KEY (ITEM_FK,CONTACT_FK)
> );

The primary-key index can be used for ITEM_FK but not CONTACT_FK, so you 
might want an index on that column.

--   Richard Huxton  Archonet Ltd


Re: Join Table

From
T E Schmitz
Date:
Hello Mike/Tom/Richard,
Thank you for your replies.

Michael Fuhr wrote:

> On Mon, Nov 01, 2004 at 04:34:32PM +0000, T E Schmitz wrote:
> 
>>Question: is it necessary/advisable to create an index for the ITEM_FK 
>>column? Or is this redundantbecause this column is already one of the PK 
>>columns?
> 
> 
> However, read the "Multicolumn Indexes" section in the "Indexes"
> chapter to be sure you understand when the index will be used and
> when it won't be:
> 
> http://www.postgresql.org/docs/7.4/static/indexes-multicolumn.html

I see. If using a multi-column PK, the order matters.
So, if I want to access the table both via the 1st and 2nd PK column, I 
would have to define an index for the 2nd column to avoid a full table scan.

Let's ask the question the other way round: I remember seeing a 
discussion (re Oracle) whether to use a multi-column PK or a unique 
constraint in such a situation - I got the impression it is one of these 
"religious" discussions ;-).
What are the pros and cons?

I have a few join tables. In the example I gave earlier the rows might 
be updated and selected via either of the two FKs. I have other join 
tables the rows of which will never be updated.
In any case, the FK/FK combination has to be unique.

If using a multi-column unique constraint, I presume the order matters 
just as it does with multi-column PKs?


> If ITEM_FK and CONTACT_FK are foreign keys, then you might want to
> add foreign key constraints to ensure referential integrity.

Thank you for the tip. I had done that further down in my init file via 
an ALTER TABLE...ADD CONSTRAINT.

-- 


Regards/Gruß,

Tarlika Elisabeth Schmitz


Re: Join Table

From
Michael Fuhr
Date:
On Mon, Nov 01, 2004 at 06:12:02PM +0000, T E Schmitz wrote:

> I see. If using a multi-column PK, the order matters.
> So, if I want to access the table both via the 1st and 2nd PK column, I 
> would have to define an index for the 2nd column to avoid a full table scan.

If you want to use an index scan when querying by the 2nd column
alone then you'd need to create an index on it.  Queries using the
1st column alone or the 1st column with the 2nd column will use the
primary key index.  You can use EXPLAIN ANALYZE to see which index,
if any, the planner uses.

> Let's ask the question the other way round: I remember seeing a 
> discussion (re Oracle) whether to use a multi-column PK or a unique 
> constraint in such a situation - I got the impression it is one of these 
> "religious" discussions ;-).
> What are the pros and cons?

Here's an excerpt from PostgreSQL's CREATE TABLE documentation:
 Technically, PRIMARY KEY is merely a combination of UNIQUE and NOT NULL, but identifying a set of columns as primary
keyalso provides metadata about the design of the schema, as a primary key implies that other tables may rely on this
setof columns as a unique identifier for rows.
 

-- 
Michael Fuhr
http://www.fuhr.org/~mfuhr/


Re: Join Table

From
Mischa Sandberg
Date:
T E Schmitz wrote:
>> On Mon, Nov 01, 2004 at 04:34:32PM +0000, T E Schmitz wrote:
>>
>>> Question: is it necessary/advisable to create an index for the 
>>> ITEM_FK column? Or is this redundantbecause this column is already 
>>> one of the PK columns?
>>
>> However, read the "Multicolumn Indexes" section in the "Indexes"
>> chapter to be sure you understand when the index will be used and
>> when it won't be:
>>
>> http://www.postgresql.org/docs/7.4/static/indexes-multicolumn.html
> 
> I see. If using a multi-column PK, the order matters.
> So, if I want to access the table both via the 1st and 2nd PK column, I 
> would have to define an index for the 2nd column to avoid a full table 
> scan.
> 
> Let's ask the question the other way round: I remember seeing a 
> discussion (re Oracle) whether to use a multi-column PK or a unique 
> constraint in such a situation - I got the impression it is one of these 
> "religious" discussions ;-).
> What are the pros and cons?

Oracle uses a tactic called 'index skip scan' that tries to make use
of an index when the first column is not restricted by the query.
http://www.oracle-base.com/articles/9i/IndexSkipScanning.php

The idea is that scanning the data in the index is fast, and the
results sets of rowids can be sorted and batched for (relatively)
efficient retrieval from the heap.

I've read one review that indicates there were pitfalls with using it in 9i:

http://www.praetoriate.com/oracle_tips_skip_scan.htm

Having used such schemes for querying (blush) ISAM files
I'd say that this isn't surprising.