There are those who believe that each and every table in a relational database must have a "uniquifier" Primary Key (IDENTITY, SEQUENCE, GUID, and so on) and there are those who actually know how to design a relational database. As Dave points out, the trouble comes when the former group is actually allowed to design databases.
Day one in a new contract, with a large multi-national bank, and a little bit of digging in the database for a business-critical application uncovered the wonderful table tDayOfMonth:
tDayofMonth DayofMonthID
(IDENTITY)DayofMonth
(VARCHAR(50))1 01 2 02 3 03 ... 29 29 30 30 31 31 Inspired by this, I dug a little further and found tMonthOfYear (I'm sure I don't need to tell you what that was all about) and tYearNumber:
tYearNumber YearID
(IDENTITY)YearNumber
(VARCHAR(50))1 1900 2 1901 3 1902 ... 159 2058 160 2059 161 2060 Note the nice use of an arbitrary offset of 1899; a security feature perhaps? This design also offers us the flexibility to update the year "1986" to "orange." Oh, and for good measure, there was also the tYearNumber_1 table; it was exactly the same.
But things got better. Take, for example, tDecisionType:
tDecisionType DecisionTypeID
(IDENTITY)DecisionTypeName
(VARCHAR(50))DecisionTypeDscp
(VARCHAR(50))SortID
(INTEGER)1 Yes Yes NULL 2 No No NULL And of course, what system designed along these lines would be complete without tBoolean ...
tBoolean BooleanID
(INTEGER)BooleanName
(VARCHAR(50))0 No 1 Yes I presume the only reason this isn't defined as an identity like the others is that they couldn't work out how to seed it with a zero. And, just to round off this WTF, there's even a tWF table.