2011-07-28 8 views
5

私は、単純なパフォーマンスとチューニング以上に成長し始めているウェブサイトを運営しています。バックエンドとしてのMySQLを備えたPHPアプリケーションです。 MySQLが適切にチューニングされ、コードが最適化されています。リレーショナルデータベースから非リレーショナルDBへのデータの非正規化のベストプラクティス

私は物事をスピードアップするためにある種の非正規化を使用できることを知っています。

ebayやAmazonと似たサイトがあるとします。データベースには、関連する情報(売り手、製品を購入した顧客、都市、州など)があります。これは、リレーショナルデータベースの複数のテーブルであり、この方法で良好なクエリーを作成することができます。しかし、たとえば、ホームページでは、(MongoDBなどの)非正規化文書を1つだけ持つことができます。これに似た最新の製品で収集、denormalied、次のようになります。この方法で

products = { 
    { 
     id:13, 
     name:"Some product", 
     city:"aCity", 
     state:"aState", 
     price:"10" 
    }, 
    { 
     id:123, 
     name:"another product", 
     city:"aCity", 
     state:"aState", 
     price:"10" 
    } 
} 

、私は(すべての関与ジョインして)、そのコレクションの代わりに、MySQLデータベースを照会でき、物事は本当に速い得ることができます。

ここに質問があります。そのデータをいつどのように非正規化しますか? たとえば、挿入時にデータを非正規化したいと思うかもしれません。

私の "create-product.php"(単純に言えば)です。私はmysqlのためにすべての "挿入"を行うことができ、その後、私はMongoのコレクションに保存を行うことができます。

また、サーバーでプログラムを実行するだけでも可能です。または最新の製品を探すためにいくつかのcronを作ってください。

これらはすべて可能性があります。職業はなんですか?あなたのexpirienceは何ですか?

ありがとうございます。

+0

シンプルなキャッシュを探しているようです。 – hakre

+0

私はそれをhakreしようとしました。しかし、Mongoを好む、それはmemcacheほど高速ではありませんが、それは永続的です、私は今必要なものです。ありがとう – santiagobasulto

+0

チャーチのバックエンドをmongoに変更して試してみてはいかがですか? – hakre

答えて

4

概念的には、ある種のキャッシュを作成していて、それを埋めることは時間がかかるため、永続キャッシュからロードすることが妥当であるという前提で永続化したいと考えています。実際のDBに戻るよりも速く実行できます。

HTMLページの断片やJSON文字列をキャッシュし、永続的ではなくフォールトトレラントな分散メモリ内キャッシュを使用して、いくつかのバリエーションがあります。

すべてのキャッシュソリューションに関する大きな疑問は、「どれくらい古いことができますか?」です。 24時間経過しているデータの中には、実際には問題ではありません。たとえば、最も人気のあるトップ10の書籍は?最新のレビュー、それらのバッチ更新のみで可能です。もっと緊急なことをするには、より迅速なアップデートがあることを確実にする必要があるかもしれませんが、あなたは本当にメインストリームにあまりにも多くの余分な処理をしたくないでしょう。たとえば、キャッシュへの更新を待っているため、顧客に遅い購入体験を与えるのは残念です。そのような場合は、キューに「更新はありますか?」というメッセージをドロップするか、実際には「エントリナンバー23が古くなっています」というメッセージをキャッシュに残しておきます。

+0

+1のメッセージキュー、一般的には良い答えです。 –

+0

本当に良い答えdjna。どうもありがとう。 – santiagobasulto

関連する問題