写真を表示することを主な目的としたウェブアプリの開発を始めています。ユーザーは写真をアップロードすることもできます。
最初に出てきた質問は、写真をファイルシステムまたはデータベースのどこに保存するかということでした。
Windowsボックスを使用してサイトをホストします。データベースはMySQLであり、バックエンドコードはASP.NET MVCを利用するC#です。
写真を表示することを主な目的としたウェブアプリの開発を始めています。ユーザーは写真をアップロードすることもできます。
最初に出てきた質問は、写真をファイルシステムまたはデータベースのどこに保存するかということでした。
Windowsボックスを使用してサイトをホストします。データベースはMySQLであり、バックエンドコードはASP.NET MVCを利用するC#です。
もちろん、thedailywtfのストーリーを目指しているのでない限り、ファイルシステム。最も簡単な方法は、SHA-1ハッシュなど、ファイル自体から派生できるプロパティで写真を整理することです。次に、ハッシュをデータベースに保存し、写真の主キーとその他の属性(アップロード者、アップロード日など)に添付します。
また、ファイルシステム上の写真を分割することもお勧めします。そうすれば、1つのディレクトリに何百万ものファイルが保存されることはありません。したがって、次のようなものになります。
storage/00/e4/f56c0de1c61fdb926e79e8a0a65bd12930c9.jpg
storage/25/9a/ec1c55bfb660548a6770238668c4b117d92f.jpg
storage/5d/d5/4b01d98f17a9ad9dd1526b49ba39b5aa37a1.jpg
storage/63/49/6f740b6c284ce6685dc17d473a7360ace249.jpg
storage/b1/75/066d178188dde110149a8422ab651b0ee615.jpg
storage/b1/20/a2b7d02b7b0c43530677ab06235382a37e20.jpg
storage/da/39/a3ee5e6b4b0d3255bfef95601890afd80709.jpg
シャードストレージに移動した場合も、これは簡単に移植できます。
写真を中心にウェブサイトを構築している場合は、データベースを忘れてください。それが普及すると、データベースは大きな打撃を受け、その時間の大部分は写真の配信に費やされます。また、データベースはあまり拡張性がありません。それらをファイルシステムに保持することには、はるかに多くの利点があります。また、コンテンツ配信用のサービスを使用して、静的コンテンツサーバーを使用することで、非常に適切に拡張できます。
また、AmazonS3または他のクラウドプロバイダーには利点があります。たとえば、S3 +AmazonCloudFrontは優れたパフォーマンスを提供します。CloudFrontはファイルを世界中のサーバーにキャッシュするため、どこからでも簡単にすばやくアクセスできます。しかし、私たちが写真について話していて、サイトが人気になった場合、あなたの請求額はかなり高くなる可能性があります。
S3の場合、 Amazonは、ストレージごと、およびクラウドへの/クラウドからの転送ごとに料金を請求します。転送ごとのCloudFrontの場合。
SQL Server 2008を使用している場合は、DBが大きくなることについて言及されている問題のほとんどを処理するFilestreamデータ型があります。これは、ファイルシステムとテーブルの間の同期に関するすべての厄介な詳細を処理します。
トピックに関するブログ投稿はこちらをご覧ください:SQL Server 2008(Katmai)にデータを保存する
一般に、人々は画像などのバイナリデータをデータベースではなくファイルシステムに保存します。これらは、データベースからファイルシステムパスを参照します。データベースからのBLOB(バイナリラージオブジェクト)の取得は、Webサーバーがファイルシステムから静的ファイルを提供できるようにするよりも時間がかかります。
私はAmazonS3のようなものを使用します。
ただし、ファイルシステムとデータベースのどちらかを選択する場合は、データベースよりもファイルシステムからイメージをサーバー化する方が高速であるため、ファイルシステムを選択します。
写真をBLOBとしてデータベースに配置する唯一の理由は、サーバーのクラスターがあり、データベースレプリケーションを使用して、クラスター内のすべてのマシンに写真を自動的にコピーする場合です。
写真をファイルとして保存し、写真のファイル名をデータベースに保存すると、作業がはるかに簡単になります。写真に固有のファイル名を作成する必要がある場合は、データベースの主キー整数をファイル名の一部として使用できます。ただし、John Millikenが提案したように、写真自体のハッシュを使用することもできます。それは単純で、単純な方が良いです。
バックアップの作成や参照整合性の維持など、すべてがデータベースにあると管理が容易になると指摘する人もいます。
それをdbに保存すると、dbは急速に大きくなり、はるかに大きくなります。表示のためにdbから画像を取得するのは、ファイルシステムから取得するよりも少し複雑です。一方、ファイル名とパスがdbに保存されているものと同期しなくなっていないことを確認することをお勧めします。過去に私はdbの代わりにディスクに保存することを選択しました。データベースを別のボックスに移動するのが簡単になりました。うまくいった。
あなたがblobデータベースを持っているとき、それは人生をとても簡単にします。ファイルシステム管理という悪夢を忘れてください。
編集
ID
VARBINARY
経験から、これはバイナリファイルを管理するための効率的な方法です。バイナリファイルしかないデータベースが1つあります。これをバックアップするのはどうして難しいのでしょうか。
私が取り組んでいるプロジェクトについても、同様の決定を下しました。DBに何か(画像やその他のBLOByのもの)を詰め込むことについての説得力のあることは、誰かが何かを(意図的または意図せずに)削除/変更する可能性が低いことです。しかし、それは私たちが行った選択ではありません。代わりに、パス情報がDBに保存され、それを使用してUNCパスを介してデータを参照します。データパスは2つの部分に格納されます。データが存在するマシンに関連するデータの場所を参照する部分と、データのグループが存在するマシンを指す部分です。データを移動する必要がある場合は、適切なパス情報を更新できます。
DBを取り出さなくてもデータを取得するのは確かに迅速です。結局、それが主要な決定要因でした。