Postgresql

在 Postgres 表和列上跟踪我自己的自定義元數據

  • November 20, 2019

有什麼方法可以將我自己的元數據添加到 Postgres 中的表和列中,例如短文本的鍵值對?

我正在從另一個數據庫系統遷移表、列和數據。該其他系統具有在 Postgres 不匹配的表和列上定義的屬性。例如,在另一個數據庫系統中,可以為每個表分配一種顏色,以用於數據庫結構的圖形顯示,例如CUSTOMER_表為綠色,INVOICE_表為紅色。

所以我想要一種方法來跟踪我的 Postgres 數據庫中的這些屬性設置,以便我的 Java 應用程序可以通過 JDBC 查詢自定義元數據。

SET attribute?

我注意到:

ALTER TABLE … SET ( attribute_option = value [, ... ] )

…和…

ALTER TABLE … ALTER [ COLUMN ] column_name SET ( attribute_option = value [, ... ] )

的文件ALTER TABLE並沒有真正解釋這些屬性的作用。我可以發明自己的屬性名稱來用作映射到我自己的元數據值的鍵嗎?

還是有其他方法讓 Postgres 記住我自己的自定義元數據?

Comment

我想一種解決方法可能是將鍵值對作為文本嵌入每個表和列上的COMMENT屬性。看起來有點像 hack,有點混亂,因為我經常使用 COMMENT 將業務規則記錄為散文。但我想它會起作用的。有更好的方法來記住每個表和每個列的屬性嗎?

Extended Properties微軟 SQL 伺服器

顯然 MS SQL Server 為此類元數據提供了“擴展屬性”功能。在 Stack OverflowMicrosoft doc 上進行了描述。

也許在 Postgres 中有類似的東西?

附加表

當然,我可以定義自己的額外表來儲存這些元數據。但我希望與目標表和列相關的東西對於那些在路上維護這個應用程序的人來說更加明顯。如果 Postgres 已經為我提供了某種自定義元數據工具,那麼重新發明輪子毫無意義。

通常最便攜的方法是擁有自己的元數據表,例如:

create table meta(
 table_name text not null,
 column_name text not null,
 attribute_name text not null,
 attribute_value text not null,
 primary key (table_name, column_name, attribute_name)
);
  • 這種方法適用於任何數據庫
  • 對元數據的訪問由標準 SQL 完成
  • 遷移和備份非常容易
  • attribute_value 可以是任何東西,您可以將其聲明為字節$$ $$, 文本, json, jsonb, 隨便你…

從a-horse-with-no-name 的評論中回答:

該手冊確實解釋了這些屬性是什麼:

> > 目前,唯一定義的每個屬性選項是 n_distinct 和 n_distinct_inherited,它們會覆蓋後續 ANALYZE 操作所做的不同值的數量估計。 > > >

如果您可以介紹自己的屬性,手冊會這樣說。但簡而言之:不,你不能引入你自己的列屬性,除非你改變 Postgres 原始碼。您唯一的選擇是將這些資訊儲存為註釋(例如作為 JSON)或創建您自己的表,將屬性儲存在 JSON 或 HSTORE 列中。

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