[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 メーリングリストの案内