(我在Heroku Postgres的工作)
我們使用的UUID作爲少數系統支持主鍵和它的偉大工程。
我建議你使用uuid-ossp
擴展名,甚至Postgres的生成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)
編輯性能影響
它將總是取決於你的工作量。
整數主鍵具有位置相近的優點,類似數據位置更接近。這對於例如範圍類型的查詢很有幫助,例如WHERE id between 1 and 10000
,儘管鎖爭用更糟糕。
如果你讀的工作量在完全隨機的,你總是讓主鍵查找,不應該有任何可測量的性能下降:您只需支付更大的數據類型。
你寫了很多這個表,而這張桌子是非常大的?這是可能的,雖然我沒有測量這一點,有保持該指數的影響。對於大量的數據集的UUID的就好了,雖然,使用UUID作爲標識符有一些不錯的性能。
最後,我可能不是最有資格的人來討論或請教這一點,因爲我從來沒有運行與UUID PK它已經成爲一個問題足夠大的表。因人而異。 (話說回來,我很想聽聽那些遇到問題的人!)
是通過數據庫中的任何其他關係作爲一個外鍵'id'場?你是否只保留這個'id'字段,因爲你相信PRIMARY KEY應該是一個串行類型,因爲你描述的原因? –
如果你有一個頻繁的訪問路徑來查詢這些pkey值的範圍,那麼通過合成主鍵進行聚類只是一個好處 - 這在現實世界中是非常罕見的。 UUID是主鍵非常好的類型,與文本類型相比,它足夠緊湊(16字節)並且比較快。 – dbenhur
@Joshua ID字段作爲外鍵的UUID字段只用作用於通信(那需要所有的時間在它們之間進行轉換) – thejaz