2012-10-01 69 views
14

在Postgres中沒有主表的主鍵有什麼缺點嗎?由於所有數據都是無序存儲在堆中的,因此主鍵只是同時強制執行唯一鍵和索引的一種方式?還是有一個基本功能,主鍵提供在一個表中,而不是一個沒有主鍵的表?Postgres沒有主鍵缺點

+1

如何處理更新表中沒有主鍵的記錄? – Olaf

+0

不需要檢索單個行,從不更新行,只插入。儘管這些行具有單獨的身份(UUID),但它們只能在範圍內抓取。我在範圍上有索引,但如果可以避免的話,在唯一鍵上有一個索引沒有意義。 – AlexGad

+1

我在問具體問題,因爲我來自SQL Server後臺並決定是在表上還是在堆表上使用聚簇索引,這是做出重要決定。對Postgres來說,這個決定似乎沒有意義,因爲數據總是無序地存儲在表中以開始。但是,我想確保在這個假設中我是正確的。在Postgres vs中PK有什麼好處,說一個獨特的約束和一個單獨的索引?有沒有區別,或只是提供這些功能的簡便方法? – AlexGad

回答

15

每Postgres的文檔(http://www.postgresql.org/docs/9.2/static/sql-createtable.html):

從技術上講,PRIMARY KEY只是UNIQUE和NOT的組合NULL,但將一組列作爲主鍵標識還提供關於模式設計的元數據,因爲主鍵意味着其他表可以依賴這組列作爲行的唯一標識符 。

從經驗來看,我創造了許多沒有它們的表格。沒有主鍵的最大缺點之一是你不能通過外鍵進行參照完整性檢查 - 因爲這種關係需要一個。我認爲一些複製解決方案還需要有一個主鍵,或者每行的單列標識符。

+0

啊,關於複製問題的好處。這完全滑了我的腦海。雖然我在每一行中都有一個唯一的UUID,但我應該確保沒有PK不會成爲複製問題(沒有外鍵,因此這不是問題)。謝謝。 – AlexGad

+1

另一個令人難以置信的問題是大多數ORM(例如Django)在處理沒有主鍵的表時遇到問題。所以,如果需要在桌面上放置一個UI,那麼對於任何正在工作的人來說,它可能會讓生活變得更加困難。這不是什麼大問題,但可能是一個考慮因素(取決於公司/團隊內的數據和發生的情況)。 –

+8

外鍵約束要求在目標列上有一個'UNIQUE'索引。不一定是主鍵。 –