Postgresql
當主鍵也是外鍵時,在 Postgres
在 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 的大小時觸發)