はじめに
PostgreSQLには、バイナリラージオブジェクト(LOB、BLOB)を管理するいくつかの方法が):
- 基本的なバイナリデータ型BYTEA
- 基本的な文字データ型TEXT
- ラージオブジェクト(LO)ファシリティ’pg_largeobject’
- データ型DATALINK(つまり、仕様です。、実装なし)
PostgreSQLは、単一のデータベースページ(通常は8KB)よりも大きな値をテーブルごとのセカンダリストレージエリアに自動的に格納する”TOAST”(特大属性ストレージ技術)と呼ばれるストレージシステムもサポートしています。 これにより、任意の列/フィールドのサイズ制限が1GBに定義されます。
ラージオブジェクトに関するいくつかの設計と実装の質問は次のとおりです:
- lo(概念的には)オブジェクト/エンティティの一部ですか、それともそれに関連付けられていますか?
- loはどのようにアクセスされますか:エンコードされた文字列、ファイルまたはストリームベースですか?
- テーブル内に格納されていない場合、誰がLOの整合性を維持しますか?
外部バイナリファイルのインポート/エクスポート
BYTEAとテキスト(およびXML)を使用する場合、外部ファイルのインポート/エクスポートの一般的な方法は、クライ Psqlで外部ファイルを処理するのは難しいです。
Stackexchange:を参照してください。
BYTEA
byteaデータ型はバイナリ文字列の格納を可能にします。
- TOASTを使用して、それぞれ表内にLOBを格納します。 したがって、1GBに制限されています
- ストレージは8進数であり、印刷できない文字を許可します(そうでない文字列とは対照的に)。
- 入出力形式はHexです(PostgreSQL9.0以降)。
ノート:
- BYTEAは、SQL標準のバイナリ文字列型’BLOB’に近いものです。 BYTEAによって提供される関数と演算子はほとんど同じですが、BYTEAの16進入力形式は異なります。
- BYTEAは、LO施設よりも長さ>20MBの方が遅い(ランダムなアクセスはありません)。
PostgreSQL docバイナリデータ型を参照してください。
TEXT
基本データ型textこれは完全性のためにここにあります。 これは、長さに制限のない可変文字タイプ(最大1GB)です。 文字タイプはロケール設定を可能にします。
これはバイト文字列ではありませんが、バイナリ文字列が前処理され、印刷可能な形式(base64やhexなど)にエンコードされている場合でも使用できます。
ラージオブジェクト(LO)ファシリティ
ラージオブジェクト(LO)は、データ型OIDの識別子を介してアクセスする必要がある’pg_largeobject’と呼ばれる単一のシステム
- クライアント(=cで書かれたモジュール)とサーバー側(=SQL)関数を提供する読み取り/書き込みAPIがあります。 関連する主なSQL関数は、lo_creat()、lo_create()、lo_unlink()、lo_import()、およびlo_export()です。 lo_import()とlo_export()には、データベースの所有ユーザー(つまりスーパーユーザー)の権限が必要です。
- LOは”チャンク”に分割され、btreeインデックス付きの行に格納されます。
- LOでは最大2GBのサイズの値を使用できますが、トーストフィールド(BYTEAなど)では最大1GBの値を使用できます。
- LOエントリは、TOAST(およびBYTEAなど)を使用してそのような操作を実行するよりも効率的な読み取り/書き込みAPIを使用してランダムに変更できます。
注:
- の場合は、” 言及’lo'(LO=ラージオブジェクト)通常、この機能を参照します。
- とは対照的に、BYTEA-LOはそれ自体のデータ型ではなく、テーブル、’facility’です。
JDBC BLOB(またはHibernateで@Lobアノテーション)を使用する場合の重要な注意事項:
- PostgreSQLはLOエントリを自身のオブジェクトとみなしているため、userテーブルの行を削除またはアップグレードしても、pg_largeobjectsのエントリは削除または削除されません。 したがって、pg_largeobjectsは、個別のクリーニングが行われない限り無限に増加します(Hibernateフォーラムのこのエラーレポートを参照してください)。
- これを防ぐには、通常、モジュール’lo’のdescriebdとしてpg_largeobjectのエントリを削除するトリガを追加する必要があります。
- PostgreSQLドキュメントの追加のPostgreSQLモジュール’lo’と’vaccumlo’を参照してください。
PostgreSQL doc’ラージオブジェクト’およびJDBCデータ型BLOB:を参照してください。
例:SQLでの典型的な使用法(Postgres docsに基づく):
CREATE TABLE image ( id integer, name text, picture oid ); SELECT lo_creat(-1); -- returns OID of new, empty large object. SELECT lo_create(43213); -- attempts to create large object with OID 43213. SELECT lo_unlink(173454); -- deletes large object with OID 173454. INSERT INTO image (id, name, picture) VALUES (1, 'beautiful image', lo_import('/etc/motd')); INSERT INTO image (id, name, picture) -- same as above, but specify OID to use. VALUES (1, 'beautiful image', lo_import('/etc/motd', 68583)); SELECT lo_export(image.raster, '/tmp/motd') FROM image -- need superuser permission. WHERE name = 'beautiful image';
DATALINK
注:現在、PostgreSQLにはそのための実装はありません。 これは、標準SQL’SQL/MED’で定義された仕様です。
DATALINKタイプは、ファイルUrlをデータベース列に格納し、制約を適用します。
- は、外部ストレージ内の特定のファイルへのリンクを維持します。
- データベースシステムは、外部ファイルの制御を引き継ぎます(名前変更、削除、権限はSQLで行われます)。
- ファイルサイズは、それぞれ外部ストレージによって制限され、無制限です。 データベースシステムにファイルの内容を格納する必要はありません。
データリンクパラメータ:
- リンク制御なしDatalink値は、既存のファイル/URLを参照する必要はありません。
- ファイルリンク制御Datalink値は、既存のファイル/URLを参照する必要があります。
- 整合性すべての参照ファイルは、SQLを使用してのみ名前を変更または削除できます。
- 整合性選択的な参照ファイルは、SQLまたは直接を介して名前を変更または削除できます。
- 整合性なし(リンク制御なし)
- ON UNLINK DELETEデータベースから削除されると、ファイルシステムからファイルが削除されます。
- ON UNLINK RESTOREファイルの元の権限は、データベースから削除されると復元されます。
- ON UNLINK NONEファイル参照がデータベースから削除されたときのファイル権限の変更はありません。
- リカバリはいPITRは参照ファイルに適用されます。
- リカバリno PITRは参照ファイルには適用されません。
ステータスとインストール:
- 不明。
:
CREATE TABLE image ( id integer, name text, picture DATALINK ); INSERT INTO persons VALUES ( 1, 'Jon Doe', DLVALUE('file://some/where/1.jpg') );
ウェブリンク:
- DATALINK wiki page
- Peter Eisentraut、PGCon2009のプレゼンテーション:
- Mse-“SQL/MED and More-PostgreSQLおよびMicrosoft SQL Serverにおける外部データの管理”に関するFlorian Schwendenerのセミナー論文(2011):