1

Stackoverflowが、特定のユーザーからのすべての質問を取得できるWebサービスを提供していると仮定します。ユーザーAからすべての質問を取得するリクエストは、次のjson出力になります。

{
    {
        "question": "What is rest?",
        "date_created": "20/02/2010",
        "votes": 1,
    },
    {
        "question": "Which database to use for ...",
        "date_created": "20/07/2009",
        "votes": 5,
    },
}

必要な方法でデータを操作して表示したい場合は、ローカルデータベースにダンプするのが賢明ですか?ある時点で、各質問のすべての回答を取得して、ローカルデータベースに保存することもできます。

私が考えているワークフローは次のとおりです。

  1. ユーザーがログインします。
  2. Webサービスは、ログインしたユーザーからの質問をすべて取得し、ローカルデータベースにダンプします。
  3. ユーザーは特定の質問に対するすべての回答を求めています。別のWebサービスがそれらを取得し、ローカルデータベースにダンプします。
  4. ユーザーがログアウトしたら、そのユーザーからのすべての質問と回答をローカルデータベースから削除します。
4

3 に答える 3

1

私はこのようにはしません。ユーザーが5,000の質問をした/回答した場合、最初のログインに永遠に時間がかかります。キャッシュする場合は、リクエストごとにキャッシュします。これにより、Webサービスドライバーの作成も簡単になります。

各Webサービス呼び出しを独自のローカル関数呼び出しでラップします。実際にWebサービス呼び出しを行う前に、データベースをチェックして、この呼び出しがまだ行われているかどうかを確認してください。ある場合は、タイムアウトをチェックして、有効期限が切れているかどうかを確認します。有効期限が切れている場合、または設定されていない場合は、サービスコールを実行し、dbに保存します。

編集

いくつかの擬似コード。関数名は次のように構成されています。

string get_question(questionId)
{


  SQL = " SELECT data FROM cache 
                       WHERE service='StackOverflow' 
                        AND proceedure='get_question'  
                        AND username='?' 
                        AND parameters = '?' 
                        AND updated > DATEADD(h, ?, GETDATE())";

   // check to see if it exists in db and is not expired
   question = db(SQL, currentUser(), questionId, 2); // single parameter is question id, 2 hour timeout

   // if question is not null, then return the question from the cache.
   if (question != NULL && question != "")
   {
     return question;
   }

   //otherwise do the webservice call to get the data.
   question = WebServiceCall('get_question',questionId);

  // store to database, delete if exists first.
   db("DELETE from cache where service='StackOverflow' AND proceedure='get_question'  AND username='?' AND parameters = '?'", currentUser(), questionId, 2
   db("INSERT INTO cache (service,procedure,parameters,username,data) VALUES(...)");
}
于 2010-03-08T21:11:46.877 に答える
1

スマートアルゴリズムを実装すれば、あなたの考えはパフォーマンスに役立つと思います。重要なのは、サービスから取得してデータベースに保存する必要のあるデータの量を決定することです。ユーザーがログインしたときに大量のデータを取得してdbに保存することはお勧めできませんが、たとえば、最初に半分をdbに保存し、残りの半分を使用する必要がある場合は、それを取得して保存できます。

于 2010-03-08T22:49:37.810 に答える
0

データベースが分離されている限り、予防策を講じており、SQLインジェクション攻撃に対して他のDBを開かない限り、これが賢明でない理由はわかりません...

特に、データを取得してDBに入れて操作しているだけなので。

しかし、それはやり過ぎかもしれません。インメモリデータセットを使用して同じことを実行し、DBへの追加の移動を節約できるように思えますが、これが機能する場合は、問題は発生しません。

于 2010-03-08T21:11:09.853 に答える