Question

I've seen this in a migration

enable_extension 'uuid-ossp'

as far as I know uuid is a long unique string based on some RFCs, and this enable the db (in this case pg) to have a column type as a uuid

my question is - Why is this type of column needed and not just a string column? is it to replace the regular integer id column and to have a uuid as the id instead?

is there any advantage to use a uuid as the id instead of just having a string type column contain a uuid?

Was it helpful?

Solution

I was hoping to see some more people chime in here, but I think the idea of the uuid is to replace the id column for a more unique id which is useful especially when you've got a distributed database or are dealing with replication.

Pros:

  • Easier to merge data
  • Better scaling when/if you have to move to a distributed system
  • Avoids Postgres sequence problems which often occur when merging or copying data
  • You can generate them from other platforms (other than just the database, if you need)
  • If you're wanting to obfuscate your records (e.g. rather than accessing users/1 (the id) which might prompt a curious user to try users/2 to see if he could access someone else's information since its obvious the sequential nature of the parameter). Obviously there are other ways of dealing with this particular issue however

Cons:

  • Requires larger key length that typical id
  • Is usually non-sequential (which can lead to strange behavior if you're ordering on it, which you probably shouldn't be doing generally anyhow)
  • Harder to reference when troubleshooting (finding by a long UUID rather than an simple integer id)

Here are some more resources which I found valuable:

OTHER TIPS

It is not necessary to install that extension to use the uuid type. The advantages of using the UUID type in instead of a text type are two. The first is the automatic constraint

select 'a'::uuid;
ERROR:  invalid input syntax for uuid: "a"

Second is storage space. UUID only uses 16 bytes while the hex representation takes 33:

select
    pg_column_size('0123456789abcdef0123456789abcdef'),
    pg_column_size('0123456789abcdef0123456789abcdef'::uuid)
;
 pg_column_size | pg_column_size 
----------------+----------------
             33 |             16

The uuid-ossp extension just adds functions to generate UUID.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top