Frage

Nehmen wir an, dass Stackoverflow Webdienste anbietet, in denen Sie alle Fragen eines bestimmten Benutzers abrufen können. Eine Anfrage, um alle Frage vom Benutzer A zu erhalten, kann zu den folgenden JSON -Ausgaben führen:

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

Wenn ich die Daten auf irgendeine Weise manipulieren und präsentieren möchte, die ich möchte, wird es dann ratsam sein, sie in eine lokale Datenbank zu werfen? Irgendwann möchte ich auch alle Antworten für jede Frage abrufen und in einer lokalen Datenbank speichern.

Der Workflow, den ich denke, ist:

  1. Benutzer protokolliert sich an.
  2. Webdienste rufen alle Fragen ab, die vom angemeldeten Benutzer gestellt werden, und lassen Sie sie in eine lokale Datenbank ab.
  3. Der Benutzer möchte alle Antworten auf eine bestimmte Frage, ein anderer Webdienst wird das Abrufen durchführt und in eine lokale Datenbank abgelegt.
  4. Löschen Sie nach dem Vorab Anmeldungen aus der lokalen Datenbank alle Fragen und Antworten dieses Benutzers.
War es hilfreich?

Lösung

Wenn Sie einen intelligenten Algorithmus implementieren, der Ihr Gedanke für die Leistung nützlich sein kann, denke ich. Es geht darum zu bestimmen, wie viel Daten Sie vom Service nehmen und in der Datenbank speichern sollten. Wenn Sie so viele Daten aufnehmen und sie auf DB speichern, wenn sich Benutzer anmeldet, ist es eine schlechte Idee, aber Sie können beispielsweise zuerst die Hälfte davon in DB sparen. Wenn die andere Hälfte verwendet werden sollte, können Sie sie nehmen und speichern.

Andere Tipps

Ich würde es nicht so machen. Wenn ein Benutzer 5.000 Fragen gestellt/beantwortet hat, dauert dies die erste Anmeldung ewig. Wenn Sie zwischenstrahlen möchten, cache pro Anfrage. Auch das Schreiben des Web -Service -Treibers erleichtert das Schreiben.

Wickeln Sie jeden Webdienstanruf mit Ihrem eigenen lokalen Funktionsanruf ein. Überprüfen Sie die Datenbank, bevor Sie diesen Anruf noch erledigt haben. Wenn Sie haben, überprüfen Sie die Zeitüberschreitung, um festzustellen, ob sie abgelaufen ist. Wenn abgelaufen oder nicht festgelegt werden, dienen Sie einen Serviceanruf und speichern Sie sie in DB.

bearbeiten

Einige Pseudocode. Funktionsnamen werden erfunden:

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(...)");
}

Ich verstehe nicht, warum dies unklug sein würde, solange die Datenbank isoliert ist, treffen Sie Vorsichtsmaßnahmen, und was Sie tun, öffnet Sie eine andere DB nicht bis zu einem SQL -Injektionsangriff ...

Zumal Sie nur die Daten aufnehmen und sie in eine DB bringen, um zu manipulieren.

Es kann jedoch übertrieben sein. Es scheint mir, dass Sie dasselbe mit In-Memory-Datensätzen tun und zusätzliche Reisen in die DB speichern können, aber wenn dies für Sie funktioniert, sehe ich kein Problem damit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top