ksuid https://segment.com/blog/a-brief-history-of-the-uuid/
Using DB autogenerated IDs risks that nightmare situation I've seen in more than one organization I've worked with: the IDs "leak" and become actual identifiers, in perpetuity, for the related entity. Now you can no longer renumber your table, and if you dump and restore you get all new IDs.
The case you describe sounds like using Oracle ROWID as a key, which I suppose people do as a hack to get around schema problems instead of fixing the schema. [1] That's an exceptionally bad idea.
[1] https://docs.oracle.com/cd/B19306_01/server.102/b14200/pseud...
To expand on this, there are three common approaches to create automatic keys in SQL applications.
1.) Generate it in the application itself. You can make UUIDs yourself with a simple call in most languages. Ensuring uniqueness is your problem--to generate integers, for example, you'll need some sort of coordination if there's more than one application thread.
2.) Generate it from a SEQUENCE. Sequences are database-side key generators that hand back a unique sequence number from a block of available sequence numbers when you call for the next number. Uniqueness is pretty much guaranteed since numbers come from the shared database server. This approach is popular in PostgreSQL and Oracle.
3.) Generate it from an auto-increment column, such as MySQL AUTO_INCREMENT columns. Auto-increment columns generate the key server-side at insert time. Uniqueness is guaranteed, but you can't see the key until it has been inserted. If you need to know the key for follow-on INSERT or UPDATE commands you have to select it back using LAST_INSERT_ID(). [1] Auto-increment keys are popular in MySQL.
ORMs like Hibernate JPA tend to provide all of these as choices. I don't use ORMs much myself hence can't comment much on the details.
[1] https://dev.mysql.com/doc/refman/8.0/en/information-function...
Also, SSN is a terrible key [1] and getting uniqueness without central coordination can be done with UUIDv4 or ksuid [2], as long as you have a reasonably trustworthy source of randomness
[1] https://news.ycombinator.com/item?id=26776092
[2] https://github.com/segmentio/ksuid/blob/master/README.md
As far as SSAN I'm not asserting it's a good key, just a natural key, which is to say a key inherent in the record.
Why would you want to sort by ID? Sort by something sensible, like the signup date instead. An autoincrement may stop corresponding to time if for instance at some point a database has an external dataset imported into it.
IMO, using an ID for anything other than an opaque identifier is asking for trouble.
“14632” in a log file could be anything, whereas a UUID is way more explicit and searchable.
"Oh, it's user 14632 - yeah I've seen that ID crop up against this issue a bunch of times in the past"
I can't do that with UUIDs.
Search for a UUID and the results are guaranteed to always be relevant. Can't do that with integers.
Unless of course, you're using a relational database like OP and incur a performance hit from using a UUID as your primary key. Additionally, they're not sortable like autoinc id's.
I've always wanted to try out Twitter's Snowflake ID [1] algorithm to get around this, but it requires requires using something like Zookeeper. I've seen some people on the net talk about UUIDv6 being sortable by time, but there's still the potential performance hit of index size.
While I'm bringing this up I've never actually tested how slow PK UUIDv1's are and at what magnitude their performance hit becomes noticeable.
[1] https://blog.twitter.com/engineering/en_us/a/2010/announcing...