[pgsql-jp: 30588] Re: 画像データベースの作成。
Jun Kitamura
kitamura @ zoozee.jp
2003年 7月 25日 (金) 02:47:18 JST
北村(逃避モード)です。
> こんにちは、青山です。
(snip)
> トランザクション処理中に、トランザクション管理からはみ出してしまう
> ようなデータ処理を行なってしまうと、本質的にデータの紛失や矛盾等を
> 許容しなければならなくなってしまいますので、
たぶん、おっしゃりたいのは、「RDBMSの トランザクション処理中
に・・・」という意味だと思いますが、つまるところ、データの紛
失や矛盾点を許容するなんて、トランザクションになってない、と
いうだけでは?
保存場所(ファイル名含む)だけを PostgreSQL に格納して、実体は
ファイルシステムに保管されている、という場合、以下の2パター
ンあります。
/tmp/xxxx.jpg を /img/xxxx.jpg にコピーし、/tmp/xxxx.jpg は
削除するものとします。
A.実行型プログラムで処理する場合
トランザクション(T1)開始
/tmp/xxx.jpg を /img/xxxx.jpg にコピー
→NG の場合は T1 ロールバック
RDBMS のトランザクション(T2)開始
・DB に /img/xxxx.jpg をインサート
→NG の場合は T2 ロールバック
・その他の DB 処理
→NG の場合は T2 ロールバック
T2 COMMIT
/tmp/xxxx.jpg を削除
T1 COMMIT
T1 ロールバックは、/img/xxxx.jpg を削除します(プログラム内
にそういうルーチンを作成してあることを意味します)。
B.PostgreSQL でファイルをコピーする関数を作成した場合
PostgreSQL のトランザクション開始
・その他の DB 処理
→NG の場合は ロールバック
・DB に /img/xxxx.jpg をインサート
トリガにより関数(F1)呼び出し
(F1)
インサートされた名称により /img からファイルをコピー
→NG の場合は FALSE 返却
/tmp 内の該当ファイルを削除
→NG の場合は FALSE 返却
(F1)が FALSE の場合は RAISE ERROR
→NG の場合は ロールバック
PostgreSQL のトランザクション COMMIT
(トリガにしない場合は、「その他のDB処理」を後に持ってきても
問題ないかも)
漏れがあるかもしれませんが、上記 A. または B. で 1つのトラン
ザクションです。
> まずは、そのリスクを仕様上許容できるのかできないのか、という観点から
> チェックすべきではないかと思います。
「ファイルの実体」と「データベース内のファイル格納場所情報」
の整合が取れないような状態にするのは(私の観点からは)許されざ
るべきことであり、それを「仕様」としてしまうのは変です。ファ
イルのコピーと、データベースへのタプル挿入、の 2つを別々のト
ランザクションと捉える設計が間違っているだけだと思います。
余談ですが、データベースへバイナリデータを入れるか、ファイル
名だけを入れるか、という問題は、[pgsql-jp: 30573] の石井さん
のファイル容量の問題がポイントだと私も思います。
大変興味深いデータでした。ちなみに、
Tatsuo Ishii <t-ishii @ sra.co.jp> wrote:
> にはインデックス領域も消費しますが,1-2MB程度で微々たるものです).これ
> はディスク領域で言うと,8192*12467/1024 = 99736KBに相当します.一方,
> 単純にファイルとして格納すると,手元のLinux/ext3では75604KBになりまし
の場合、1-2MBのインデックス(微々たるとおっしゃってますが)ま
で含めた容量の差の中に、75018バイトの画像が、あと何枚入ると
思ってるんだっ!・・という貧乏的な観点から、私はファイル名だ
けをデータベースに入れて、実体は別に持つと思います。いや、も
ちろん他に理由はありますが。:-)
pgsql-jp メーリングリストの案内