Это хорошая идея для кэширования данных из веб-сервисов в базу данных? - PullRequest
1 голос
/ 09 марта 2010

Предположим, что Stackoverflow предлагает веб-сервисы, где вы можете получить все вопросы, заданные конкретным пользователем.Запрос на получение всех вопросов от пользователя 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. Веб-службы получают все вопросы, заданные вошедшим в систему пользователем, помещают их в локальную базу данных.
  3. Пользователь хочет получить ответы на все вопросы по конкретному вопросу, другой веб-сервис выполняет поиск и выводит ихв локальной базе данных.
  4. После выхода пользователя из системы удалите из локальной базы данных все вопросы и ответы этого пользователя.

Ответы [ 3 ]

1 голос
/ 09 марта 2010

Я бы так не поступил.Если пользователь задал / ответил на 5000 вопросов, первоначальный вход в систему будет длиться вечно.Если вы хотите кешировать, кешируйте по запросу.Это также облегчит написание драйвера веб-сервиса.

Оберните каждый вызов веб-службы собственным вызовом локальной функции.Перед тем, как делать вызов веб-службы, проверьте базу данных, чтобы узнать, выполняли ли вы этот вызов.Если у вас есть, проверьте время ожидания, чтобы увидеть, истек ли он.если срок действия истек или не задан, обратитесь в службу поддержки и сохраните в db

edit

Некоторый псевдокод.имена функций составлены:

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(...)");
}
1 голос
/ 09 марта 2010

Если вы реализуете умный алгоритм, ваша мысль может быть полезна для производительности, я думаю.Дело в том, чтобы определить, сколько данных вы должны взять из сервиса и сохранить в базе данных.Перенос большого количества данных и сохранение их в БД при входе пользователя в систему - плохая идея, но вы можете, например, сначала сохранить половину из них в БД, а когда следует использовать другую половину, вы можете взять и сохранить ее.*

0 голосов
/ 09 марта 2010

Я не понимаю, почему это было бы неразумно, если база данных изолирована, вы принимаете меры предосторожности, и то, что вы делаете, не открывает какую-либо другую БД для атаки SQL-инъекцией ...

Тем более, что вы просто берете данные и помещаете их в БД для манипуляции.

Однако, это может быть излишним. Мне кажется, вы могли бы сделать то же самое с DataSets в памяти и сохранить дополнительные поездки в БД, но если это работает для вас, я не вижу проблем с этим.

...