いすバイナリデータをデータベースまたはファイルシステム?[定休日]

StackOverflow https://stackoverflow.com/questions/662488

  •  20-08-2019
  •  | 
  •  

質問

この問いは、お問い合わせいただく前(大文字、画像-イン-sql が主にデータを変更します。私の場合これらのデータを保存、まったく変わりませんね。による良いものです。

ある理由としては、まだ静バイナリデータをデータベース?

とで良いかの優れた点を格納データの別のテーブル?(しょうめっこしたらいいと思います。DBの専門家に...)

の解明:はないだろうがよ10-20ユーザーがこれまでのとする。バイナリデータを移動します。

役に立ちましたか?

解決

DBのデータを記憶することの利点は、DBセキュリティメカニズムを利用することとmaintanenceコストを低減された(バックアップを、...)。これの欠点は、(接続ごとのライセンスをデータベースサーバーの高価であるかもしれない)DB負荷を増大させるとの接続を消費しています。あなたは、SQL Server 2008を使用している場合は、 FILESTREAM のがいいかもしれません代替ます。

ところで、Webアプリケーション(またはストリーミングデータを必要とする可能性のある他のアプリ)のために、それは、DB外のデータを保存するために通常より賢明です。

他のヒント

テーブルがそれにLOBを持っているとき、巨大なメモリおよび/または帯域幅の問題を引き起こして、「テーブルから選択*」をすることについてのすべてのこの話は非問題です。返されたすべてのことは、問題のLOBへのポインタです。足りません評判はコンテキスト内のコメントを入れて、これを見て、人々は、それは問題ではないことを知っている必要があります。

あなたはBLOBを格納する場合の最大のdissadvantageは、メモリ消費量です。 あなたはxから選択*は、それぞれに45Kの画像で何千ものレコードのために何をするのか想像できますか?

Mehrdadは利点もある言ったように。あなたはそのアプローチで行くことにしたのであれば、あなたはほとんどのクエリは、それらのBLOBデータと少ない結果を返すようにデータベースを設計しようとする必要があります。たぶん、例えば、この目的のために一対一の関係を作ります。

ビューの原理の観点から問題に対処する、リレーショナルデータベースは、構造化データを格納するが(主に)です。あなたは、クエリ条件を作るか、またはデータ要素に参加できない場合、それはおそらく、データベースに属していません。私は、WHERE句で使用されている画像のBLOBが表示されていないので、私はデータベースの外部に保つと思います。一方、CLOBは、クエリで使用することができる。

精通していかなり良いサイズのOSSプロジェクトを決定、発足時に画像を保存のMySQLデータベースで実績のあるその中でもトップともいえない3悪意して対応を続けています。(悪化による利用という面があったのである"refactor容赦"はanathema、それは別の話です。)

の中で問題になることができ:

  1. を超える最大限の効率的なデータベースのサイズ(mysql).(必要な合計スペースは、映像を超える他のすべてに、少なくとも2桁).

  2. 画像ファイルを喪失"fileness".なお日にサイズ等ない限り保存される(重複してクチャを必要とするコード)をもっていることにあります。

  3. 任意のバイト配列にな工程もすべての時間は、いずれまたは操作が可能です。

  4. "ませんへのアクセスを必要とされる画像を外部には危険を前に参考になりました。

  5. 脆弱性にで全体の配置が不自然に微妙な問いかがでし込来への貢献と反refactor意識).

に影響を与えます。なしできたらいいのにと思い、外れないの少なくとも抵抗です。

私は、これは、アプリケーションあなたの建物に依存だと思います。あなたはCMSシステムを構築している、とのデータの利用は、Webブラウザ内で画像を表示することが予定されている場合は、データベースに入れされるのとは対照的にディスクに画像を保存しても意味があります。正直、私はすべての場所でファイルをコピーすることなく、ファームにサーバーを追加する可能性がその両方を、どうなるもののます。

別のユースケースは、ワークフローなどの複雑なオブジェクト、またはinterdependanciesの多くが付いても、ビジネスオブジェクトであるかもしれません。あなたは、バイナリまたはテキストベースの形式にこれらの両方をシリアライズし、DBに保存できます。 ATOMIC、バックアップ、等...

:その後、DBの利益を得ます

私は人々が最初の場所でselect *クエリを使用する必要があるとは思いません。何をして、第2のブロブを返す、一つの方法は、要約情報を返し、データを取得する2つの方法を提供します。あなたが一度にすべての画像の何千ものを返すために必要があるだろう、なぜ私が想像することはできません。

誰でもデータベースに画像(または他のバイナリ文書)を格納する考えを持っていたことは、私は、非常に満足している誰かではありません。データベースは[ほとんど?]スローアウェイ、離散データの保存のためのものです。無意味なバイナリデータのではないのBLOB。あなたがバイナリデータBLOBの最初の手で働いてきた場合、あなたはすでにこれを知っています。

あなたは、ファイルシステム内のファイルへの参照を格納する必要があります。ベストプラクティスは、ファイル名ではなく、絶対的な(あるいは相対)パスである。

私たちは、システム内の添付ファイルを保存し、そしてあなたは、添付ファイルを変更することはできませんので、私は我々がいることをデータ/ wが同じページ上だと思う「保存されており、変更はありませんされます。」私たちは、特にそれをデータベースに保存するために、のないのを決めました。我々は2つの理由から、シンプルさ、およびバックアップ/リカバリ時間のためにこれをやりました。

シンプルは、最初:私たちのケースでは、これらの添付ファイルは、エンドユーザーのブラウザからアップロードされ、それはちょうどそれがその後、SQLパイプをそれらをストリーミングするよりも(DBサーバ上の)ディレクトリに書き込むために簡単です。そこDBにおけるそれらの記録があるが、DBだけで添付ファイルのメタ情報が含まれており、ディスク上のファイルの名前(私たちの場合はGUID)

バックアップ/リカバリー側ではこれらの塊は、おそらくあなたのデータベースの最大の作品の一つとなります。あなたは、フルバックアップを実行するたびに、あなたはその後、変更しないことを知っていても、何度もこれらのビットをコピーすることがあります。私たちにそれだけで(非常に)小さいバックアップを持って、そしてバックアップとしてセカンダリサーバーに添付ファイルディレクトリのXCOPYを行うにははるかに簡単なように見えた。

これはLOBまたはCLOBのか、正確に何ではないです....設計されていた?

私たちは、大手航空会社のシステムのためのクレジットカードのカード取引の大規模な暗号化を保存するためのCLOBを使用します。

メモリ消費量は、しかし、あなたの最大の犯人です。

HTH

歓声、

一部のデータベース(例えば。PostgreSQLは)自動的にDBから直接それらを読むとき、おそらくそれは高速です、フィールドを圧縮します。そしてまた、プログラムは、1つの急襲のすべてのフィールドと画像を読み込むことができます。

パフォーマンスの問題ここで、上記のようにアドレスされて、私はそれを繰り返すことはありません。しかし、私は良いヒントあなたは(そのようなウェブサイト上の画像/文書など)がたくさん出てストリーミングされるものを格納している場合は、キャッシュシステムで構築することだと思います。

このことで私は、データベース内のすべてのデータを格納し、誰かがそのファイルを要求したとき、それがディスク上に存在するかどうかを確認(Tempフォルダに、知られているファイル名に基づいて)、そうでない場合は、DBからそれをつかむと意味しますフォルダに書き込み、その後、ユーザーにそれをストリーミングします。それがディスク上に存在するため、同じファイルに次の要求のために、それはDBを押すことなく、そこから提供することができます。人々がそれらを要求するよう、彼らはDBから再び再構築されるように、しかし、あなたはこれらのファイルを削除する必要がある場合(または、あなたのウェブサーバがkapputを行く!)、それは問題ではありません。これは、DBから同じファイルに対する各要求にサービスを提供するよりもはるかに高速である必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top