(Saya bekerja di Heroku Postgres)
Kami menggunakan UUID sebagai kunci utama pada beberapa sistem dan berfungsi dengan baik.
Saya sarankan Anda menggunakan uuid-ossp
ekstensi, dan bahkan postgres membuat UUID untuk Anda:
heroku pg:psql
psql (9.1.4, server 9.1.6)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.
dcvgo3fvfmbl44=> CREATE EXTENSION "uuid-ossp";
CREATE EXTENSION
dcvgo3fvfmbl44=> CREATE TABLE test (id uuid primary key default uuid_generate_v4(), name text);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_pkey" for table "test"
CREATE TABLE
dcvgo3fvfmbl44=> \d test
Table "public.test"
Column | Type | Modifiers
--------+------+-------------------------------------
id | uuid | not null default uuid_generate_v4() name | text |
Indexes:
"test_pkey" PRIMARY KEY, btree (id)
dcvgo3fvfmbl44=> insert into test (name) values ('hgmnz');
INSERT 0 1
dcvgo3fvfmbl44=> select * from test;
id | name
--------------------------------------+-------
e535d271-91be-4291-832f-f7883a2d374f | hgmnz
(1 row)
EDIT implikasi kinerja
Itu akan selalu tergantung pada beban kerja Anda.
Kunci utama bilangan bulat memiliki keunggulan lokalitas di mana data serupa berada lebih dekat. Ini dapat membantu misalnya:kueri jenis rentang seperti WHERE id between 1 and 10000
meskipun pertikaian kunci lebih buruk.
Jika beban kerja baca Anda benar-benar acak karena Anda selalu melakukan pencarian kunci utama, seharusnya tidak ada penurunan kinerja yang terukur:Anda hanya membayar untuk tipe data yang lebih besar.
Apakah Anda banyak menulis ke tabel ini, dan apakah tabel ini sangat besar? Ada kemungkinan, meskipun saya belum mengukur ini, bahwa ada implikasi dalam mempertahankan indeks itu. Untuk banyak set data, UUID baik-baik saja, dan menggunakan UUID sebagai pengidentifikasi memiliki beberapa properti yang bagus.
Akhirnya, saya mungkin bukan orang yang paling memenuhi syarat untuk membahas atau memberi saran tentang ini, karena saya tidak pernah menjalankan meja yang cukup besar dengan UUID PK yang menjadi masalah. YMMV. (Karena itu, saya ingin mendengar orang-orang yang mengalami masalah dengan pendekatan ini!)