Thanks for all the suggestions. My schema is now a lot cleaner, and my
application runs 30% faster!
Jeff
Richard Klein wrote:
>> 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
>>
>
> As Dennis points out, I had assumed that the relationship between the
> primary and secondary tables was many-to-one, i.e. that several entries
> in the primary table could refer to the same entry in the secondary
> table.
>
> If that is not the case -- if the relationship is in fact one-to-one --
> then Dennis's solution is the best one.
>
> I would use Dennis's two-SELECT approach rather than the join if speed
> is an issue.
>
> - Richard
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users