I know surrogate primary keys are generally recommended over natural primary keys but are the arguments in favor of the surrogate primary keys valid when it comes to usernames?
From a customer standpoint, you bet. I don't want my username to be DWong1145.
NO, you should use username only as a unique key/constant. Username can be change, just and example: it may be a trademark and the owner requests you to drop it.
If you don't want to get duplicate usernames, create a UNIQUE constraint
.
What if DWong1145
wants to change it's username? Will you to make all database relationships to be UPDATE CASCADE
?
It is a good candidate in some sense, however you have to consider if you really want to do it. For instance, you have a user with a certain user name, then the user gets "deleted" (or marked as deleted). So, there is actually no reason for not allowing to create another user with the same username, but it is already "taken", since it's a primary key.
A big disadvantage of having a string as primary key, regardless of whether it's a username or something else, is that all foreign key columns referencing the table will also have to be strings, which is both slower and wastes more space.