Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Because if you want to refer to things by a UUID, now you have two indexes


UUIDs are very wasteful [1]. For most use cases you can replace them with much shorter strings and still have very low chances of collisions [2]

[1] https://henvic.dev/posts/uuid/

[2] https://alex7kom.github.io/nano-nanoid-cc/


Call me crazy, but I'm simply splitting my UUID into the higher and lower bits and indexing off that.

IE

    CREATE TABLE foo(
        id_ms    UNSIGNED BIG INT NOT NULL,
        id_ls    UNSIGNED BIG INT NOT NULL,
        PRIMARY KEY (id_ms, id_ls)
    ) WITHOUT ROWID;
That works well with UUIDv7 and is just storing 128bits rather than a full string. In most languages it's pretty trivial to turn 2 longs into a UUID and vice versa.


Is there any advantage to this approach over Postgres native uuid support which should store the same number of bits?


No. This approach is strictly for DBS like sqlite without uuid or 128bit integer support.


Sure, at cost of increased complexity of access. Sometimes the waste is worth the simplicity.


Sounds complex, just use a UUID. If that’s the dominating factor for storage, then you have a different problem to solve.


In SQLite, if you were to define a TEXT column (or anything other than INTEGER, for that matter) with a UUID as the PK, you’d already have two indices, because it stores data based on the rowid [0]. So you’d already have a level of indirection, where the “PK” would be pointing to the rowid.

You could define the table as WITHOUT ROWID [1], but as docs point out, the average row size shouldn’t exceed 200 bytes for the default 4 KiB page size. Since a UUID in text form is at best 32 chars, that doesn’t leave much for the rest of the columns.

[0]: https://www.sqlite.org/lang_createtable.html#rowid

[1]: https://www.sqlite.org/withoutrowid.html




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: