2009-07-08 11 views
4

私は、データベースに保存されているデータが非常に一般的なコンテンツ管理アプリケーションに取り組んでいます。この特定の例では、コンテナには多くのリソースがあり、それらのリソースは、ピクチャ、ムービー、アップロードされたファイル、またはプレーンテキストであろうと、何らかの種類のデジタル資産にマップされます。データベースの代わりにファイルシステムからテキストを提供していますか?

写真を保存するだけでなく、ファイルシステムにテキストアセットを保存し、アプリケーションがファイルの場所をデータベースから検索するようにしたいので、私は同僚と1週間議論してきました。 )、クライアントアプリケーションに提供する前に(ファイルシステムから)テキストファイルを読み込みます。

これはばかげていると私は悲鳴を上げると私たちはデータベースから何かを見て気にしている場合は、テキストをデータベースの列に格納し、行のルックアップに一緒に役立つかもしれない。データベースルックアップ+ファイルIOは、コントロールできないほど遅く、データベースルックアップのように思えました。しばらくの間行ったり来たりして、私はいくつかのベンチマークを実行することにしました。結果は少し驚くべきものでした。ベンチマーク時は一貫性がほとんどないようです。ベンチマークの唯一の優秀な唯一の勝者は、データベースから大量のデータセットを取り出し、結果を繰り返してテキスト資産を表示することでしたが、データベースからオブジェクトを一度に1つずつ取り出し、テキストコンテンツを表示することは首と首のようでした。

ベンチマークの実行の限界を知っていますが、 "テスト"の正しいアイデアを実行しているかどうかはわかりません(たとえば、ファイルシステムの書き込みはデータベースの書き込みが馬鹿馬鹿しく高速ですが、 。私は私の質問が確認のためだと思う。ファイルI/Oは、データベースのテキストストレージ/ルックアップに匹敵しますか?私はここで議論の一部を欠いていますか?あなたのご意見/アドバイスをお寄せいただきありがとうございます!

私が使用しているかについての迅速な作業: これは、Ruby 1.8.6とsqlite3のを使用してのRuby on Railsのアプリケーション、 です。明日、 と同じコードベースをMySQL に移動し、ベンチマークが であるかどうかを確認します。

+0

Iの避難所を使用することができませんでしたそのようなテストは自分ではできませんでしたが、ファイルシステムがどのように多くのファイルが存在するのかと不思議です。最終的にファイルシステムは単なる一種のデータベースでもあります。私が "本当の"データベースについて気に入っているのは、トランザクション処理/アトミック・インサートです。どういうわけかファイルシステムで私は編集的であり、操作の途中で書き込みがクラッシュし、ファイル全体が破損状態になる恐れがあります。 これは、ファイルシステムに大きな「ダム」ファイル(画像など)を入れて、ファイル名をdbに保存するのが一般的なアプローチだと言いました。ただし、Webサーバーに直接提供するようにしてください。 –

答えて

1

あなたのベンチマークの結果は、データベースにテキストデータを保存する方法によって決まると思います。 LOBとして保存した場合は、通常のファイルに保存されます。 どのような種類のLOBでも、データベース検索+ファイルIOは有料です。

VARCHARは

通常のテキスト・データ・タイプ(VARCHARら)は非常に一般的なリレーショナルデータベースシステムではサイズが限られている表領域に格納されています。 2000または4000(Oracle)のようなものが8000または65536の文字になることがあります。一部のデータベースは、長いテキスト をサポートしていますが、 these have serious drawbacks and are not recommendedをサポートしています。

LOBは、システムファイルへの参照であるテキストを使用して、LOBデータ型(Oracleで例えばCLOB)を使用する必要が大きい場合

オブジェクト。

通常、LOBは次のように動作します。 データベースにはファイルシステムオブジェクトへの参照のみが格納されます。 ファイルシステムオブジェクトは、データ(例えば、テキストデータ)を含む。 これは、DBMSが参照とファイルを管理する重い作業を持ち上げる以外は、あなたの同僚が提案するものと非常に似ています。

最終行は です。テキストをVARCHARに格納することができます。 2つのオプションがない場合は、次のようにします。LOBを使用するか、データベースから参照されるファイルにデータを格納します。どちらも技術的には似ていて、VARCHARを使用するよりも遅いです。

+0

私たちが使用するデータベースはmysql5なので、私が流しているドキュメントです。このページ:http://dev.mysql.com/doc/refman/5.1/en/char.htmlは、最大文字長が理論上65,535に設定されていることを示しているようです...それらの65,535バイトですが、私が調べる必要があるユニコードになると、私は変換が何であるか分かりません。 LOB以外の文字列(MySQLのテキストフィールド)で長い文字列が危険な可能性があると思いますか? – BushyMark

+0

私はユニコードがどのように扱われているのか疑問に思いました。 utf-8として格納されている場合、1文字は最大4バイトですが、英語のテキストでは1文字あたり1バイトが一般的です。 MySQLで実際に大きなVARCHARSが発生する危険の1つは、最大行サイズ(65,535バイト、すべての列で共有されます)を満たすことができることです。 MySQLのTEXTとVARCHARのパフォーマンス比較については、http://forums.mysql.com/read.php?24,105964,105964を参照してください。 –

3

ファイルシステムを使用しないことから得られる主な利点は、データベースが同時アクセスを適切に管理できることです。 2つのプロセスが同じテキストを同じ時刻に変更する必要があるとします。ファイルシステムとの同期は競合状態につながる可能性がありますが、データベース内のすべての問題はまったく問題になりません。

+0

これは素晴らしい情報です。 – BushyMark

0

私はこれを前にしました。その混乱は、ファイルシステムとデータベースを常に同期させておく必要があるため、推測するようにプログラミングが複雑になります。 私のアドバイスは、データに応じて、すべてのファイルシステムソリューション、またはすべてのデータベースソリューションのいずれかになります。特に、多くの検索、条件付きデータの取得が必要な場合はデータベース用、それ以外の場合はfs。 データベースは、大きなバイナリファイルの格納に最適化されていない可能性があることに注意してください。それでも、両方を使用する場合は、同期させておく必要があります。エレガントで楽しい(プログラムを作成する)ソリューションには向いていません。 幸運を祈る!

0

あなたの問題は、「パフォーマンスの側面」から来ている場合、少なくとも、あなたは「なしSQL」(例えばオームを経由して、)のRedis、またはCouchDBのようなストレージソリューション...

関連する問題