Usually performance
In theory / design, you have a logical model where, say, the username is unique.
However, during implementation, you know that using it is expensive (case, accents, length, etc.) compared to using the surrogate column "userid", which is more efficient as an index. Having said that, you will have an index by name, as it must be unique.
The difference is where you use this index: if it is in the child table as a foreign key column, this is not a good idea. Or as a clustered index.
As a single index for a table without FKs, it is neither here nor there.
Finally, I would just use char / varchar for things like the ISO language or currency codes (DE, EN, GBP, CHF, etc.). But my cutting is honest ...
gbn
source share