(Pracuji na Heroku Postgres)
Na několika systémech používáme UUID jako primární klíče a funguje to skvěle.
Doporučuji použít uuid-ossp
a dokonce nechat postgres vygenerovat pro vás UUID:
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)
UPRAVIT důsledky pro výkon
Bude vždy závisí na vaší pracovní zátěži.
Celočíselný primární klíč má výhodu umístění, kde jsou podobná data blíže u sebe. To může být užitečné např. pro:dotazy typu rozsah, jako je WHERE id between 1 and 10000
i když spor o zámek je horší.
Pokud je vaše zátěž při čtení zcela náhodná v tom, že vždy provádíte vyhledávání primárního klíče, nemělo by docházet k žádnému měřitelnému snížení výkonu:platíte pouze za větší datový typ.
Píšete hodně do této tabulky a je tato tabulka hodně velká? Je možné, i když jsem to neměřil, že existují důsledky pro udržování tohoto indexu. Pro mnoho datových sad jsou však UUID v pořádku a použití UUID jako identifikátorů má některé pěkné vlastnosti.
A konečně, možná nejsem nejkvalifikovanější osoba, která by o tom mohla diskutovat nebo radit, protože jsem nikdy neprovozoval dostatečně velkou tabulku s UUID PK, kde by se to stalo problémem. YMMV. (Když už to bylo řečeno, rád bych slyšel o lidech, kteří mají s tímto přístupem problémy!)