質問

1つのパッケージでエクストラネットとイントラネット全体を強化するバックエンドCMSシステム全体を構築するプロジェクトが登場します。私が答えを見つけようとしてきた質問は、どちらが良いのかということです。データベースに画像を保存して(SQL Server 2005)、整合性、単一の複製計画などがあるか、ファイルシステムに保存される可能性がありますか?

私たちが抱えている問題の1つは、常に同じデータを持つ必要がある複数のサーバーロードバランスが取れていることです。現在のところ、SQLレプリケーションはそれを処理していますが、ファイルレプリケーションは少し難しいようです。もう1つの懸念は、同じ画像の複数の解像度を持ちたいということです。ファイルシステムに各バージョンを作成および保存するのが最適か、リクエストに応じて解像度の画像を動的に引っ張って作成するかどうかはわかりません。

私たちの懸念は次のとおりです。

  • データの整合性
  • データレプリケーション
  • 複数の解像度
  • データベースとファイルシステムの速度
  • データベースとファイルシステムのオーバーヘッド負荷
  • データ管理とバックアップ

誰かが同様の状況を持っているか、何が推奨されるかについて何かを持っていますか?助けてくれてありがとう!

正しい解決策はありません

他のヒント

Microsoft Researchが発表した素敵な研究論文がありました ブロブするかどうか 彼らがあらゆる種類の変数と影響を見たところ。

最終的に彼らの発見:

  • サイズが最大256 kbのブロブは、ファイルシステムよりも効率的にデータベースに保存されます
  • 1 MB以上の場合、ファイルシステムはより効率的です
  • その間には投げられます

その論文が公開されて以来、SQL Server 2008はFileStream属性も追加して、ファイルシステムに物を保存するが、トランザクション制御下では現実になっています。チェックすることを強くお勧めします!

この質問は頻繁に発生します - 参照してください これ したがって、結果を検索します。

正しい答えはありません - それは状況に依存します。

個人的に - DBにファイルパスとファイルシステムにファイルを保持します。それぞれに独自の強みがあります。ファイルとデータベースをバックアップできます。これもの結論でもあります この男, 、大量のデータを管理しています。

特に多くのサーバー全体で静的ファイルの複製を管理するのは難しい場合があります。それは、データベースのサイズと負荷との管理、監視、デバッグの間のトレードオフに本当になります。

おそらくデータベースのアプローチを選択し、負荷が問題になった場合、画像呼び出しの周りに何らかのキャッシュレイヤーを配置することを検討してください。

DBにパスを保存するための提案には、複数のマシンでこれを複製する実際の問題がありません。

あなたの懸念は2つのキャンプに分類されます。以下の懸念は、データベースにドキュメントを保存することを支持します。

  • データの整合性
  • データレプリケーション
  • 複数の解像度
  • データ管理とバックアップ

これらの懸念は(おそらく)ファイルシステムにドキュメントを保存することを支持します。

  • データベースとファイルシステムの速度
  • データベースとファイルシステムのオーバーヘッド負荷

したがって、最も重要なことを決定し、それに応じて選択します。

さて、あなたの上位2つのニーズが整合性と複製である場合、答えは間違いなくDBです。

あなたは他のポイント:

  • 整合性-DB、それがデータベースが存在する理由とフラットファイルシステムです。

  • 複製 - 画像の複製を意味するかどうかはわかりませんが、もしそうなら、明らかにこれをロードバランスにしないので、明らかにdb。

  • DB画像から複数の解像度を実行できますが、これにより処理コストが追加されます。また、解像度が高いほど、サイズが大きくなるほど、ネットワークが待ちます。複数の解像度が速度を交換します。

  • 速度 - 画像へのアクセスに応じて、無視できる可能性があります。ファイル共有全体で画像を使用している場合、いずれにせよネットワークを待つ必要があり、ネットワークはほとんど常にボトルネックです。

  • オーバーヘッド - 率直に言って、オーバーヘッドの定義と画像へのアクセス方法に依存します。

  • 管理、DB、ハンドダウン。特異ストレージ=心配が1つ少なくなり、いずれにせよデータベースで常にバックアップを実行している必要があります。ファイルシステムのバックアップは、多くの点でコストがかかります。

議論の両側には有効な懸念があるため、常に要件を与えてください。どのくらいのデータ、いくつの画像、どれくらいの大きさですか?

インライン /ブロブストレージ

利点: :アーキテクチャと実装を簡素化し、システムのバックアップと回復または移行を簡素化します。ダンプ、バックアップ、エクスポート(DBのフレーバーの用語が何であれ)を実行し、新しいデータベースに移動します。バージョンの制御 /一貫性はDBによって処理されるため、ポイントインタイムの回復を可能にします。セキュリティ /アクセス制御もクリーンです。なぜなら、画像ブロブへのアクセスは、全体の行へのアクセスに固有のものであるためです。画像をDBの外側に移動し、HTTPサーバーを取り外しますが、同時性とスケーラビリティのためにより優れていますが、ユーザーがHACKをハッキングして所有していない画像を要求できないことを確認するには問題があります。 DBの外でそれらを収容する場合は、セキュリティポリシーがユーザー間の画像のアクセス制御をカバーしていることを確認してください。 HTTPサーバー認証は、システム全体の認証と統合する必要があるか、画像を提供するHTTPサーバープログラムが何らかのセッションメカニズムを使用してHTTPリクエストが有効であることを確認する必要があります。これは、マルチテナントデータベースでは非常に大きな懸念事項です。単一の目的では、単一のテナントシステム、単純な認証を備えた懸念はありません。

欠点: :非常に大きなデータベースの場合、バックアップとリカバリはイライラするか、問題があり、コストがかかります。すべてを1つの一貫したデータベースとして扱うことは、整合性の観点からは良好ですが、エンタープライズの品質、データウェアハウスの調整されたバックアップ、リカバリを備えたDBMSを使用しない限り、バックアップには悪いです(例はOracle RMANとローリングバックアップです)。

常にシステムで回復する時間を考慮してください。ストレージの要件が<数ギガバイトで、50〜100GBの均一な場合、そして多くのバックアップスペースが計画されている場合、インラインストレージはクリーンです。それ以上に、懸念を分離し、ファイルシステムにその仕事をさせることが重要な利点になります。小さなデータエラーのために、巨大なデータベースを復元し、回復し、開くことを試みることほど悪いことはありません。回復時間が私の最大の懸念事項です。

一般に、CMSに関する限り、DBの持続的な画像データはファイルシステムほど効率的ではない可能性があります。かつては、おそらく画像を静的に表示したいだけで、その画像をグラフィックデザイナーがアップデートなどで利用できるようにしたい場合もあります。

作業するたびに画像を取得することに関連する処理オーバーヘッドを検討してください。

ファイルシステムを考慮する必要がある理由

  1. ブラウザはすべての作業を行い、あなたは画像のプロキシキャッシュなどから利益を得ます
  2. 上記の派生物として、コンテンツ配信ネットワーク(CDN)を簡単に使用できます
  3. RSYNCなどのツールでは、画像データの複製は簡単です
  4. 処理(CPU)時間は大幅に最適化されています

Windows環境にいると仮定すると、ファイルシステムを使用する大きな理由はありません。不要なページの分割を避けるために、テーブルに画像を保存する方法に注意することをお勧めしますが、それはパフォーマンスの調整であり、大きな問題ではありません。

ファイルシステムへの欠点

- 自動的に複製されていません

- すべてのインスタンスに異なる物理的な場所を持つことで、複雑な複雑なレプリケーションを複雑にすることができます

- 非常に多数のファイルを備えたスロー

ファイルシステムの利点

- いくつかの非常に大きなファイルを保存している場合、パフォーマンスが少し良くなります。

私は...するだろう;

1)各画像に一意の識別子(GUID)を割り当てる2)そのGUIDで画像にタグ/名前3)OS(ファイルシステム)4にGUIDを保存)データベースに完全に適格なファイル名(FQN)ポインターを保存します。

データベースに画像を保存することは、ストレージとメンテナンスの点で高すぎます。 FQNポインターのみを保存すると、より良いソリューションが提供されます。また、トリガーといくつかのストアドプロシージャを通じてバックエンドの整合性チェックを構築することもできます。

1つの理由で画像をデータベースに保存することはありません(私の答えはSQL Serverから来ています):

Webサイトの簡単な画像が入力されたSQLサーバーデータキャッシュは必要ありません。データキャッシュに実際にデータが含まれていることを望んでいます。また、マルチ層アーキテクチャがある場合は、バイナリデータの塊よりも画像のURLを渡すのがはるかに簡単です。ただし、特定の人に画像(セキュリティ)を見てもらいたい場合は問題に遭遇します。

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