I'm not sure why I'm jumping in here and I'm not sure if someone has
already said what I am going to say so I apologize in advance. I also
have over 30 years of database design experience and in my mainframe days,
all primary keys were "natural" and many were compound. It took me a few
years of using Access to become converted to the "autonumber as PK camp"
but I have. I find autonumbers extremely easy to work with. Access does
have an issue with autonumbers that are not defined as primary keys so I
would NEVER use a "natural" PK in a table that also had an autonumber.
the autonumber would ALWAYS be the PK and would be used for all
relationships. When I have business rules to satisfy that revolve around
uniqueness of "natural" keys, I use unique indexes.
The benefits of using an autonumber PK are:
1. there is never a need to cascade PK updates since the PK is an
autonumber and by definition cannot be changed.
2. Business rules regarding uniqueness can be implemented with unique
indexes.
3. In the cases where one of the "natural" keys may validly be blank, I
don't have an issue with a unique index whereas I would have an issue if
I defined a compound primary key since PKs may not contain null values.
SSN is a good example here (aside from the fact that there are laws
prohibiting its use as a PK) since not everyone will have one (h1b visa
holders for one) and there are only limited cases where a person actually
has to provide one to the requestor.
4. Combo/List boxes require code behind the scenes to work if the unique
identifier is compound.
5. As the hierarchy gets deeper, the compound key grows and joins become
more unwieldy. It is way too easy to omit one field out of 5 in a join
with disastrous results if the error isn't discovered quickly.
The only pro for using autonumber PKs is that a lot of your tables will
end up with lots of numeric columns that you would prefer to view as text
when you open the table. The solution is NOT table level lookups, it is
creating queries that join the tables so you can see the identifying
"natural" key data from the parent table. You only have to create one of
these views for each table so it's not like it is a great deal of work.
Then for yourself (because ONLY you should be viewing tables or queries
directly), just remember to open the query rather than the table when you
want to see the natural key values.
That's my opinion and I'm stickin' to it