Jeff Gibson wrote:
> 
> One thing your earlier suggestion brought up.  The way I was hooking up 
> tables before was something along the lines of:
> 
> CREATE TABLE primary(id1 INTEGER PRIMARY KEY, <primary_fields>);
> CREATE TABLE secondary(id2 INTEGER PRIMARY KEY, <secondary_fields>);
> CREATE TABLE link(id1 INTEGER, id2 INTEGER);
> 
> My understanding of your suggestion is:
> 
> CREATE TABLE primary(id1 INTEGER PRIMARY KEY, id2 INTEGER, 
> <primary_fields>);
> CREATE TABLE secondary(id2 INTEGER PRIMARY KEY, <secondary_fields>);
> 
> with the understanding that id2 in primary will often be NULL.  Are 
> there any circumstances where the first alternative is more 
> appropriate?  I'm pretty new to databases, but I got my original idea 
> from a few schemas that I've seen.  I'm just trying to understand the 
> trade-offs.
>     Thanks a lot for your help,
>     Jeff
> 

These different forms of linking the records are used for different 
types of relations. The two tables can have records that are related in 
a various combinations of one or many to one or many.

     one to one
     many to one
     one to many
     many to many

Using a third table is required to implement a many to many relation. 
Each record in the third table stores one item of the relation (i.e 
which record in the first table is related to which record in the second 
table).

A one to many relation is created by assigning an id to the record in 
the one side of the relation and referencing that id in a column on the 
many side of the relation. A many to one relation is the same a one to 
many relation, with the order of the tables reversed. This is what you 
have shown as Richard's suggestion.

A one to one relation can be created by assigning an id to one record 
and using that same id as the primary key on the related record.

For your case, you need a one to one relation between the primary and 
secondary tables. This can be done by using the same id for the related 
record in the secondary table as was assigned to the record in the 
primary table.

CREATE TABLE primary(id INTEGER PRIMARY KEY, <primary_fields>);
CREATE TABLE secondary(id INTEGER PRIMARY KEY, <secondary_fields>);

insert into primary values(null, <primary fields>);
insert into secondary values(last_insert_rowid(), <secondary fields>);

When you want to retrieve the records you can use a join

select * from primary join secondary using(id);

or you can use a second select to retrieve the secondary fields using 
the id obtained from the primary field.

select * from primary;
if (has_secondary())
     select * from secondary where id = primary.id;

This does not waste any space storing unnecessary null fields. You 
should only resort the more complex foreign keys when you need to 
represent a more complex relation.

HTH
Dennis Cote
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to