5

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?

1

2 Answers 2

5

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:

Sign up to request clarification or add additional context in comments.

1 Comment

As for data length, a typical ID field uses a 32-bit or 64-bit integer. A UUID is 128-bit value, stored as such by Postgres. So two or four times larger. Well worth it if you need the benefits such as federated data. Fortunately, memory and storage are cheap nowadays.
3

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.

1 Comment

To summarize: The data type of UUID is already built into Postgres. No need for the extension to store and retrieve UUID values. If you want to generate UUID values from within Postgres, then you need the extension. The common use-case: Assigning a UUID as a default value to a new row.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.