2010-12-30 3 views
0

読み取り専用のアプリケーションでは、現在データをリレーショナルデータベースに保存していますが、アプリを使用してデータを照会するのではなく、その関係を含むデータをXMLファイルに毎晩書き出します。確かにXML「キャッシュ」とクエリDBの読み込み欠点?

、それは多くのデータではありません - XMLは、1000個の未満のオブジェクトを表します。

次に、クライアント側のコードを、私はそのデータをロードしています、そしてそれは、必要に応じて、「照会します」。

書き込み操作は不要です。アプリの唯一の機能は検索と表示です。

私はそれがDBまたはロードされたXMLを照会するかどうかは非常に簡単に切り替えることができるような方法でアプリを開発してきた、と私はパフォーマンスを比較することができています。

ロードされたXMLのアプローチでは、フルテキスト検索(それ自体)は即座に行われます。

はしかし、私は、このアプローチには欠点がある知っている、とあなたがたのうち、いつ、なぜこれがあるか、または有効なアプローチではありません私は肉付けを助けることができれば、私はそれを大幅に感謝します。

ありがとうございます。

+0

どのような種類のデータベース、MySQL? SQLiteのように、この場合はもっと簡単なことでしょうか? – Ernest

+0

私は開発用にSQLiteを使用していますが、本番環境ではMySQLを計画していました。あなたが考える必要はないかもしれませんか? – moso11

答えて

0

あなたが良いXML処理エンジンにXMLをロードすると、それはXPathクエリや一般のツリートラバーサルをスピードアップするために、適切なデータ構造を構築します。

あなたは、リレーショナルデータベース内のデータを保持し、それを照会すると、クエリオプティマイザがあまりにもいくつかの最適化された方法でデータにアクセスするクエリプランを作成します。

完全に最適な方法は、クエリの性質によって異なります。

XMLドキュメントを読み込んで各クライアント呼び出しで解析すると非常にコストがかかることに注意してください。また、解析されたXMLツリーをメモリ内に保持するアプリケーションサーバーを使用しない限り、データベースクエリはおそらく1000レコードでは、テーブル全体がキャッシュに収まるからです。

+0

ありがとうございます。具体的には、Flexアプリケーションのコンテキスト内で、厳密に型指定されたオブジェクトにXMLを解析しています。私はオブジェクトを "照会"する独自のコードを持っています - 主に配列をフィルタリングしています。配列は検索結果ビューのデータプロバイダです。答えの最後の部分では、XMLファイルに書き込むのではなく、キャッシュを使用し、各クライアントの負荷をすべてロードして同じ結果を得ることを提案していますか?あなたは「かなり高価」で少し拡大できますか? – moso11

+0

@ moso11: 'MySQL'キャッシュはクライアント間で共有されます。これは、リレーショナルクエリに適合する方法ですべてのデータを「RAM」に格納したことを意味します。アプリケーションサーバーなしでスクリプト言語を使用する場合、 'XML'ファイルはディスクから読み込まれ、各クライアント要求で解析される必要があります。これは 'CPU'リソースをたくさん使います(ファイルの複雑さによって異なります)。 – Quassnoi

+0

[OK]を1秒間私に付いてください。 (= 私は実行されたすべての検索のためにDBに問い合わせることを避けたいのですが、いくつかの選択肢があります 1)XMLファイルをディスクに書き込みます。それ以降の負荷はありません。 2)そのXMLをデータベースに格納し、キャッシュをオンにして、アプリケーションのニーズに合わせて同じ結果を得ます。 3)DB上で完全なSELECTクエリを実行し、キャッシュをオンにしてXMLファイルを生成します。 これらのオプションのいずれかがあなたを妥当なものとして攻撃すると仮定します。再度、感謝します! – moso11

0

私には妥当と聞こえます。

データのサイズが非常に大きく、使用可能なメモリが脅かされたり、スレッドの安全性が問題となるような方法で共有されていた場合、欠点が生じます。

は、しかし、あなたはそれが小さく、読み取り専用だと言うので、私には罰金聞こえます。必要な場所にデータを近づけることは、すべてのハードウェア設計者が理解できるものです。

XMLとして保存されていますが、1日に1回ファイルを読み込み、解析してメモリ内のDOMオブジェクトに格納し、XPathを使用してクエリを実行すると仮定します。 XPathのパフォーマンスはニーズに適していますか?それが私の唯一の懸念です。

+0

ありがとうございます。はい、基本的に、JSではなくFlex/Actionscriptですが。データがクライアント側に照会される方法については、Quassnoiへの私の答えを見てください。私はそれがまったく適切だと思います。 – moso11

+0

あなたの答えをもう一度読む私は、あなたが言ったことを誤解しているかもしれないと思います。明確にするために、XMLをクライアントのFlash Playerにロードします。この場合、アプリケーションがロードされるたびにXMLがロードされます。あなたがDOMオブジェクトを言ったとき - 私は、あなたがウェブアプリケーションがロードされるたびにXMLをJavascript経由で格納することを意味すると想定していました。隠れたフォーム値などである。実際、何を意味しましたか?ありがとう! – moso11

+0

あなたはFlashについて何も言及していませんでしたが、XMLをどのプログラムにロードしても、解析してメモリ内のデータ構造に格納する必要があると考えました。通常、これはDOMツリーです。 – duffymo

0

すべてがリソース管理になります。クエリを実行するリソースがある場合は、データがキャッシュされているXMLファイルを解析して解析しているのと比べて、データが「ライブ」なので、より良い方法です。何千万行ものデータを照会していない限り、パフォーマンスが心配されているなら、あまり気にしないでしょう。私たちには常に約60人以上のクライアントが常駐しており、一日中いつでもクエリーを実行できます。ボックスは実際に実行されているすべてでかなりうまく実行できます。 XML解析は、ほとんどの場合、クエリよりもサーバーに負荷がかかる可能性があります。

+0

ありがとうございます。私はパフォーマンスの心配はありません。 SQLiteに対するdbクエリーでは5フィールドのフルテキスト検索に数秒かかりますが、ロードされたXMLアプローチでは「即時」であるという事実に興味があります。あなたはおそらくあなたの "よりストレスの多いサーバー"のポイントを拡大することはできますか? – moso11

+0

XMLを解析する際には、XMLの解析に通常より多くのリソースを使用して、1行のデータをクエリして返します。明らかにXMLのデータ長に依存しますが、今のところは瞬間かもしれませんが、そのデータがより大きなモンスターにクロールすると、XMLはSQLが返すよりも解析に時間がかかります。実際にアプリケーションを最適化してライブデータを保持し、PHPをバックエンドとして使用する場合は、Zend Framework.http://www.framework.zend.com/manual/1.11/en/zendの機能をご覧ください。 db.adapter.html – Dreamcube