The surrogate numeric key has been a necessary evil for as long as
we've had SQL. It was set into SQL89 because the new SQL databases had
to interact with older applications which expected "row numbers." It's
a bit of legacy database thinking (...)
Inevitably, practices which are "necessary evils" tend to become
"pervasive evils" in the hands of the untrained and the lazy. Not
realizing that ID columns are a pragmatic compromise with application
performance, application developers with an shallow grounding in
RDBMSes are enshrining numeric IDs as part of the logical and
theoretical model of their applications.