web-dev-qa-db-ja.com

SQL Serverに画像を保存する?

私は小さなデモサイトを作りました、そしてそれの上に私はSQLサーバのimage列の中に画像を格納しています。いくつか質問があります。

  • これは悪い考えですか?

  • サイトが成長したときに、パフォーマンスに影響がありますか?

別の方法としては、画像をディスクに保存し、その画像への参照のみをデータベースに保存するという方法があります。これは多くの人が抱えてきた共通のジレンマであるに違いありません。私はいくつかのアドバイスを歓迎したいと思いますし、できれば実際に間違いを少なくして幸せです。

169
marko

マイクロソフトリサーチによる本当に良い論文 BlobへまたはNot To Blob があります。

多数のパフォーマンステストと分析を行った後の結論は次のとおりです。

  • 写真や文書のサイズが通常256K未満の場合は、それらをデータベースのVARBINARY列に格納するほうが効率的です。

  • 写真や文書のサイズが通常1 MBを超える場合は、ファイルシステムに保存するほうが効率的です(SQL Server 2008のFILESTREAM属性を使用すると、トランザクション管理下に置かれ、データベースの一部になります)。

  • この2つの間に、あなたの用途によってはちょっとした混乱があります。

写真をSQL Serverのテーブルに入れることにした場合、それらの写真を保存するために別のテーブルを使用することを強くお勧めします - 従業員の写真を従業員のテーブルに保存しないでください。そうすることで、クエリの一環として従業員の写真を選択する必要が常になくなると仮定して、Employeeテーブルをスリムで平均的で非常に効率的に保つことができます。

ファイルグループについては、 ファイルとファイルグループのアーキテクチャ のイントロをチェックしてください。基本的には、最初から大きなデータ構造用に別のファイルグループを使用してデータベースを作成するか、後で追加のファイルグループを追加します。それを "LARGE_DATA"と呼びましょう。

これで、VARCHAR(MAX)またはVARBINARY(MAX)列を格納する必要がある新しいテーブルを作成するときにはいつでも、ラージデータ用にこのファイルグループを指定できます。

 CREATE TABLE dbo.YourTable
     (....... define the fields here ......)
     ON Data                   -- the basic "Data" filegroup for the regular data
     TEXTIMAGE_ON LARGE_DATA   -- the filegroup for large chunks of data

ファイルグループについてのMSDNイントロを調べて、それを試してみてください。

234
marc_s

私は一度このジレンマに陥り、グーグルで意見を求めてかなり調査しました。私が見つけたのは、実際に多くの人が大きい画像の方がより良い画像をディスクに保存するほうがよいと思うのに対し、mySQLは特にPHPのような言語からのアクセスを容易にすることを可能にします。

私は同様の質問を見つけました

MySQL BLOB vs小さいPNG画像を保存するためのファイル?

私の最終的な評決は、プロフィール写真のように、ユーザ1人あたりに存在する必要がある小さな四角い画像の場合、hSQLにたくさんの親指を保存するよりも、mySQLのほうが良いでしょう。 /画像ファイルが優れています。

それが役に立てば幸い

14
Kevin Chavez

画像をディレクトリに保存してから、画像ファイルへの参照をデータベースに保存します。

ただし、データベースにイメージを格納する場合は、イメージ列が別のファイルに格納されるようにデータベースをパーティション分割する必要があります。

ファイルグループの使い方の詳細については、こちら http://msdn.Microsoft.com/ja-jp/library/ms179316.aspx を参照してください。

13
John Hartsock

SQL Serverに画像を保存するときは、 'image'データ型を使用しないでください。MSによると、新しいバージョンのSQL Serverでは廃止されています。代わりにvarbinary(max)を使用してください。

https://msdn.Microsoft.com/ja-jp/library/ms187993.aspx

10

なぜ、Webサーバー上のカタログではなくデータベースに写真を保存するのが良いのでしょう。

クライアントが長年使用してきた、サーバー上のフォルダーに格納されている多数の写真を使用したアプリケーションを作成しました。

今、彼らはあなたのところへ行きます。それらのサーバーは破壊されており、新しいサーバーに復元する必要があります。彼らはもう古いサーバーにアクセスすることはできません。唯一のバックアップはデータベースのバックアップです。

もちろんソースがあり、それを新しいサーバーに簡単にデプロイし、SqlServerをインストールしてデータベースを復元することができます。しかし、今ではすべての写真が消えています。

あなたがSqlServerに写真を保存したならば、すべては以前のように動作するでしょう。

たった2セントです。

9
Erling Ervik

ファイルテーブルと呼ばれる別のオプションが2012年にリリースされました。 https://msdn.Microsoft.com/ja-jp/library/ff929144.aspx

7
Cyrus Downey

パフォーマンスの問題は有効ですが、実際にはデータベースにイメージを保存しないようにする必要があるという本当の理由は、データベース管理のためです。あなたのデータベースは非常に急速に成長し、データベースは単なるファイルストレージよりもはるかに高価になります。データベースのバックアップと復元は、ファイルのバックアップの復元よりもはるかに高価で時間がかかります。つまらないことに、画像でいっぱいになったデータベースよりもはるかに速く、小さいデータベースを復元することができます。 Azure上のファイルストレージの1 TBを1 TBデータベースと比較すると、コストに大きな違いがあることがわかります。

2
J Miglietta