One of the amusing things in the natural vs surrogate key debate, is that one is constantly reminded that surrogates make it so much easier on the developer, the SQL gets so clean and simple (that even a developer is able to write it)... but in a lot of cases, the only thing the user can use when trying to search the database, is the composite candidate key. So to fetch all records from the child table mathcing the criteria, the previous SQL might end up looking something like this:
[tt]SELECT ...
FROM tblParent P INNER JOIN tblChild C ON p.SurrogatePK = c.SurrogateFK
WHERE P.ProdCode = "ABC" and P.ProdWeek = "L" and P.BatchMethod = "Drum" and P.Site = "MySite"[/tt]
So to get at the correct child record(s) - or retrieve the correct surrogate key to use in the join, one need to "look up" the candidate key in the parent table – now, that's efficiency;-)
I see no problem with using a three field composite PK in Willirs first sample, as long as the junction table isn't a parent table to other tables, so the composite PK needs to be propagated to child tables. Even a lot of surrogate key fans, prefer using a composite primary key in junction tables. See for instance r937's answer here
Composite Keys in M:N Relationship (you may have to register to enter that site, but I believe it's free).
Here's one quote, if registering isn't an option:
"
The only time it makes sense to use a surrogate key is when the relationship table itself has child tables, and the child tables have many rows, and the queries using the child tables are complex. Relationship tables with child tables do occur, but they are rare. Unless you have a compelling reason, use composite keys."
I don't think I've gotten enough information here to decide upon what I would use, but I think, based on the complexity of the structure, I'd proabably include surrogate key in the considerations. Some of the things I'm not entirely sure of is the number of records, but that's another discussion than design - with more than half a million records, and a complex structure - BNPMike's suggestion of another database seems also to be worth considering (the free alternative to SQL-Server, MSDE?).
When I'm in a situation where records in multiple tables can be identified with the same PK structure, I suspect there might be flaws in the design, that there may be something so similar, it might perhaps be recorded in the same table, using a status switch to determine the difference between them, but of course, that's only a suspicion.
Creating an extra concatenated field, derived from the fields of the current natural key, what would that be - a supernatural key? - reduncancy yes, violating normal forms yes, recommendable - perhaps if you're into SM, love headaches and hate leaving work when business hours is over, you may consider that approach;-) I'd say either natural composite or surrogate. I guess BNPMike hit the nail pretty much on the head with "
So I guess the bottom line is there is no right way.".
BTW - here's one article that might amuse
KEY WARS: EPISODE 1
Roy-Vidar