Postgresql

當主鍵也是外鍵時,在 Postgres

  • November 18, 2019

在 Postgres 12 中,我正在跟踪照片。每個都很大,每個大約 6 到 8 兆。為了快速瀏覽,我會將縮略圖與完整圖像一起儲存。full 和 thumbnail 都是 BYTEA 類型的列。

為了性能,我想避免在只需要縮略圖時載入完整圖像。據我了解,當訪問一行時,所有 BYTEA 欄位值都將載入到記憶體中。因此,即使在查詢中未明確請求時,向使用者顯示縮略圖列表也必然會在伺服器上傳入完整的照片。

所以我將把照片表分成兩部分,將縮略圖儲存在主表中,並將縮略圖儲存在單獨的子表中,一對一。

在這種情況下,子完整照片表攜帶其父縮略圖行的 ID 作為外鍵。該外鍵列在邏輯上也可以用作主鍵。

我可以將孩子的一列指定為外鍵和主鍵嗎?如果是這樣,是否有任何注意事項需要注意?

主鍵和外鍵

我可以將孩子的一列指定為外鍵和主鍵嗎?

是的,一點沒錯:

create table photo 
(
 id integer primary key, 
 ... other columns ...
);

create table thumbnail 
(
 id integer primary key references photo, 
 ... other columns ...
);

吐司

bytea列儲存在普通列數據之外(在所謂的“toast 表”中)並且不會被檢索,除非您將它們包含在 SELECT 列表中。

從手冊中引用

TOASTed 屬性的大值只會在結果集發送到客戶端時被提取(如果完全選擇)。

這僅意味著即使查詢被強制執行 Seq Scan,也不會檢索 bytea 列,直到確定需要發回的行。因此,如果您的查詢對 100 萬行進行了 seq 掃描,但只返回了 1 行,則只會讀取一個 bytea 值並將其發送到客戶端。

請注意,如果縮略圖足夠小,縮略圖實際上可能是內聯儲存的(而不是在 toast 表中)(TOASTing 僅在小於約 2k 的大小時觸發)

引用自:https://dba.stackexchange.com/questions/253429