Twitter API - Follower + Datenbank

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Killver
User
Beiträge: 32
Registriert: Montag 12. Juli 2010, 17:03

Hallo!

Ich bin derzeit dabei via der Twitter API sehr, sehr viele Follower von sehr, sehr vielen Usern abzufragen. Ich benutze für die API calls derzeit die Twitter Library für Python (welche teilweise leider bisschen sehr lange braucht).

Nun folgendes Problem, ich möchte die Tabelle in meiner Datenbank in etwa so aufbauen:

ID1, TweetID, UserID, FollowerID, Is Friend

D.h. beispielhaft sollte das so aussehen dann:

1, 1, 5678, 6789, 1
1, 1, 5678, 9857, 0
1, 2, 6744, 4000, 1

Ich glaub man kann sich ein Bild machen wie ich mir das in etwa vorstelle (muss dann in Zukunft Group Bys auf die FollwoerIDs machen). IsFriend is nur ein Bool das mir sagt ob eine gegenseitige Freundschaft besteht.

Nun aber das wirkliche Problem:

Die API Calls dauern EWWWIG, d.h ich möchte, um es zumindest ein bisschen zu vereinfachen immer schauen ob ich die follower des users schon habe, um mir einen API Call zu sparen. Aber da die Tabelle astronomisch groß wird, verzögert sich die Abfrage. Ein Index würde hier zwar was bringen, aber der wächst ja nicht mit, d.h. ich müsste dauernd den Index upgraden, oder?

Vielleicht die Tabelle auf zwei Tabellen aufteilen?

Bion über Ideen sehr dankbar. Falls ich es zu kompliziert erklärt habe, bitte nochmal nachfragen ;)

Und vielleicht jemand eine Idee wie ich di Twitter API Calls schneller amchen kann? Brauche immer Follower und Friends von user_ids.

Danke und lg
Philipp
BlackJack

@Killver: Ein Index wird ständig mitgeführt, den muss man nicht manuell aktualisieren. Was übrigens auch heisst, dass man mit Indizes Abfragen beschleunigen kann, Daten einfügen aber etwas länger dauern kann als ohne Index. Wenn man viele Daten einfügt und weiss, dass man während der Zeit keine Abfragen macht, könnte man so einen Index für die Zeit auch absichtlich abschalten oder wegwerfen und nach dem Einfügen wieder aktivieren bzw. neu aufbauen.

Deine Tabelle anscheinend nicht in Normalform. Die Follower-Beziehungen sind doch nicht von den Tweets abhängig. Oder willst Du die Veränderungen über die Zeit erfassen? Also sowas wie: bei Tweet X ist Benutzer A noch nicht Benutzer B gefolgt, aber bei Tweet Y war das der Fall. Wenn Du diese Fragen nicht an Deine DB hast, stecken dort zwei verschiedene Tabellen in einer.

Und `IsFriend` scheint mir redundant zu sein!?
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

aufgrund der Struktur kannst du mal über ein KV-Store nachdenken. Ist abgesehen davon schneller als MySQL & Co.

Gruß, noisefloor
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hat evtl. Twitter nach außen hin eine Bremse in der API eingebaut?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

jens hat geschrieben:Hat evtl. Twitter nach außen hin eine Bremse in der API eingebaut?
Besser wäre eine Art "Kanten"-Limit ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

jens hat geschrieben:Hat evtl. Twitter nach außen hin eine Bremse in der API eingebaut?
IO dauert einfach und man kann nur eine bestimmte Anzahl an Request in einem bestimmten Zeitraum machen, sonst blockt Twitter.
Killver
User
Beiträge: 32
Registriert: Montag 12. Juli 2010, 17:03

BlackJack hat geschrieben: Deine Tabelle anscheinend nicht in Normalform. Die Follower-Beziehungen sind doch nicht von den Tweets abhängig. Oder willst Du die Veränderungen über die Zeit erfassen? Also sowas wie: bei Tweet X ist Benutzer A noch nicht Benutzer B gefolgt, aber bei Tweet Y war das der Fall. Wenn Du diese Fragen nicht an Deine DB hast, stecken dort zwei verschiedene Tabellen in einer.

Und `IsFriend` scheint mir redundant zu sein!?
Ich muss, sobald ich alle User-Follower Beziehungen habe, sagen können, wie welche Follower wie viele Tweets gesehen haben.

D.h. ein GROUP BY auf die Follower_IDs und ein COUNT auf die TweetIDs. Lässt sich so also nicht vermeiden :/
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

KV-Store. :-)

Struktur wie folgt (sofern ich dein Anliegen richtig verstanden habe):

$USERID:tweets = (Liste der Tweet-IDs)
$USERSID:follower = (Lister der Follower-IDs)
$TWEEDID:follower =(Lister der User-IDs, die dem Tweet gefolgt sind)
$FOLLOWERID:tweets = (Liste der Tweet-IDs)

Sollte sich mit z.B. mit Redis + Python-Bindings recht leicht realisieren lassen.

Gruß, noisefloor
Antworten