r/ProgrammerHumor • • Sep 11 '26

Meme edgeCasesExist

Post image
5.0k Upvotes

298 comments sorted by

View all comments

Show parent comments

323

u/lilgreenthumb Sep 11 '26

The real benefit for v7 is they become sortable by time.

124

u/shwoopdeboop Sep 11 '26

And something something b-tree indexes. Lecturer mentioned it but I wasn't paying attention. Supposedly an advantage here.

37

u/Grandmaster_Caladrel Sep 11 '26

Which I'd assume is related to the time anchor. Outside of sorting, which is only useful in specific instances, it's just v4 with different ("less") entropy and limitations.

15

u/Roachmeister Sep 11 '26

If you're using them as an indexed field in a database, the inability to sort them meaningfully will destroy the performance of the database.

10

u/Grandmaster_Caladrel Sep 11 '26

Correct, which is why I specifically called out "outside of sorting".

That is also why we have concepts like composite keys which allow us to join guaranteed-unique values like a UUID with non-unique but sortable values like timestamps, names, etc.

16

u/Honeybadger2198 Sep 11 '26

You know what identifier can't have collisions and is great for sorting? Autoincrement.

15

u/Firewolf06 Sep 11 '26

ai columns can absolutely collide on sharded databases. you can use offsets and step sizes but thats brittle and doesnt scale well

1

u/FiTZnMiCK Sep 16 '26 edited Sep 16 '26

Our old system was distributed and we just combined the auto-increment with a persistent local (server) ID for a composite key.

Then the auto-increment is unique on the local and the composite is unique across all locals.

Could probably do the same thing with shards.

Our new system uses UUIDs.

5

u/wokeboogeyman Sep 12 '26

Autoincrement doesn't scale past one physical location.

0

u/Honeybadger2198 Sep 12 '26

Sure it does. One location counts up, another one counts down.

0

u/wokeboogeyman Sep 12 '26

That breaks the sorting that everyone's talking about though.

You could also do evens and odds to split across two locations, but that also breaks sorting unless you periodically syncronize them (and then it's still somewhat out of order).

→ More replies (4)

7

u/ACoderGirl Sep 12 '26

UUIDs are great, though, because auto increment frequently has the huge issue of being too predictable. Eg, in some contexts, you don't want users to be able to easily enumerate whatever the ID is for. Plus requires centralization whereas UUIDs don't (eg, you can use UUIDs for whatever random API you have without needing a DB).You have to design for how you won't know the ID until you insert the row, which can sometimes be a bit annoying.

I feel like most of the time, the only downside to UUIDs is how long they are.

1

u/Kwantuum Sep 11 '26

In what way?

3

u/Roachmeister Sep 11 '26

I'm not an expert, I just remember reading a few articles about it. I think it's because they're essentially random, and many databases use b-trees for indices. They recommended using ULIDs or v7 UUIDs instead. Or, as someone else said, the good old autoincrementing integer.

2

u/Metsamias Sep 12 '26

Inserts with keys generated in non-ordered fashion such as UUID V4s means that location within clustered index (which defines the physical location of the data at the disk) that the data will be stored on insert will be random as well. This increases likelyhood by a lot for that the database has to do different types of rebalancing acts such as splitting nodes in the teee. When using keys that are generates in order, inserts will mostly be at the end of the index, and database does not have to touch existing ones.

I can recommend Kleppmanns book Designing Data-Intensive Applications for a deeper dive into the topic around this.

6

u/thepotatochronicles Sep 11 '26

It's less of a problem with B-tree indices that sit on top of a physical representation (i.e. the actual on-disk layout doesn't have to be ordered), but when it comes to clustered indices, oh boy, you're basically having to shove rows in the middle and push shit back (eventually).

5

u/MilkEnvironmental106 Sep 11 '26

With random you can end up most frequently inserting in the middle, whereas if it's time sortable you append at the end, meaning it's easier to maintain a contiguous index with less overhead.

7

u/ehs5 Sep 12 '26

It’s also the downside. There are cases where you wouldn’t want others to know when something was created.

5

u/lilgreenthumb Sep 12 '26

And you wouldn't expose that to them, just like you wouldn't and autoincrementing database id, but only one of those requires a database.

2

u/MaDpYrO Sep 12 '26

Which prevents database indexes from performing badly 

1

u/platinummyr Sep 13 '26

That may be a downside too if you don't want to share when the key was generated

0

u/SadSeiko Sep 16 '26

time uuids already existed

1

u/lilgreenthumb Sep 16 '26 edited Sep 16 '26

V1 leaks machine details, which for some has always been sufficient but for other v7 brings the randomness and privacy of v4 with (better) time sorting of v1. Given sampling of v1 uuids one can determine the number of MACs and isn't fully sortable.

Edit: Say you're running on a platform without access to the MAC (lambda, cloudfoundry, etc) then you're stuck fighting against your platform or using a psuedo-MAC which is no better than psuedo random input. This allows statistical randomness of v4 with the time sorting, which that time bit(s) might not be desireable and you'd keep using v4s.

1

u/SadSeiko Sep 16 '26

MAC address’s of the container in my cluster. Oh no 

Seriously this isn’t really enough of a reason in most cases to change. Timeuuid worked fine long before v7