Postgresql

postgres中的oid vs bytea

  • May 25, 2017

我有一個名為 tblA 的表,它有兩列

id_ (numeric 50,0), obj_ oid

例如, tblA 有 1 個條目

id_  | obj_
1    | 1001

在 pg_largeobject 表中,有三個針對 loid 1001 的條目(3 頁),這很好。但是,pg_largeobject 表有三列(

loid  | pageno    | data
(oid)   (integer)   (bytea)

我閱讀了有關 oids 和 bytea 的資訊,它們都是不同的數據類型並以這種方式使用。但是我對 pg_largeobject 表結構感到困惑,為什麼它對相同的數據使用兩種數據類型?

postgres 是否在內部將 oid 儲存為 bytea,並且只返回 oid 以供參考?如果它以這種方式工作,為什麼不能只使用數字類型而不是 oid 類型作為參考。

如果不是,這裡的 oid 有什麼用,數據庫中某個 oid 後面是否有任何數據,bytea 列數據是關於什麼的?

oidas 類型是一個 32 位無符號整數,它代表object id,並被系統用作通用代理鍵來引用不同的對象,有時是pg_catalog. 作為大型對象的鍵類型只是其眾多用途之一。其他“對象”,如表、序列、類型等,由它們的oid.

但是我對 pg_largeobject 表結構感到困惑,為什麼它對相同的數據使用兩種數據類型?postgres 是否在內部將 oid 儲存為 bytea,並且只返回 oid 以供參考?如果它以這種方式工作,為什麼不能只使用數字類型而不是 oid 類型作為參考。

它將大對象的內容以小字節頁(~2000 字節)的形式儲存在pg_largeobject表中,以loidID 或大對象的形式儲存,並(loid,pageno)以該表的唯一鍵的形式儲存。for 新值的生成器loid可以比作一個整數序列,只是在環繞 at 之後2^32,它可以避免與現有值發生衝突。作為使用者,我們不必關心這個,它由內部管理。

如果不是,這裡的 oid 有什麼用,數據庫中某個 oid 後面是否有任何數據,bytea 列數據是關於什麼的?

oid 用作句柄,而 bytea 列保存實際的二進制數據。

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