Actually, I think the rule of thumb is typically to use a natural key rather than a surrogate whenever possible...
So if I have, for instance, an Invoice table and an InvoiceDetail table, we can probably use InvoiceNumber as our primary key on the first one. It already exists in our data and (I assume?) would be unique. For the second table, we are probably going to be stuck needing a surrogate key, however -- whether it's joined to Invoice number as composite or not.
In any event, back to the original question... hometoast's link should get you started.
-- Kevin Fairchild