2010-07-29 2 views
9

Ich entwerfe eine App, bei der die Nutzer einander im Twittersinn folgen, aber ich habe wenig Erfahrung mit Datenbank-/Abfragedesign/Effizienz. Gibt es Best Practices für das Management, Fallstricke etc.? Ich nehme an, das kann eine sehr große Last auf die dB erstellen, wenn nicht richtig gemacht (oder vielleicht sogar dann?)."Follower" und Effizienz

Wenn es einen Unterschied macht, ist es wahrscheinlich, dass Menschen nur einer relativ kleinen Anzahl von Menschen "folgen" (aber eine Person kann viele Anhänger haben). Aber das ist nicht sicher, und ich möchte nicht darauf zählen.

Alle Ratschläge dankbar erhalten. Vielen Dank.

Antwort

6

Ganz einfach und einfach mit voller normalisation zu tun. Wenn Sie eine Tabelle mit Benutzern mit jeweils einer eindeutigen ID haben, verfügen Sie über eine TABLE_FOLLOWERS-Tabelle mit den Spalten USERID und FOLLOWERID, die alle Follower für jeden Benutzer als Eins-zu-eins-zu-viele-Beziehung beschreibt.

Sogar mit Millionen von Assosizations auf einem halbwegs ordentlichen Datenbankserver wird dies gut und schnell funktionieren, solange Sie eine gute Datenbank benutzen (IE, nicht MS-Access).

+0

Ich weiß es ist schon lange, ich frage mich, 'FOLLOWERID'would Speicher mehrere Werte? – lazyprogrammer

1

Das hängt davon ab, wie viele Benutzer Sie unterstützen müssen; Wie viele Follower erwartest du von Nutzern? und welche Art von Finanzierungs-/Entwicklungsbemühungen, auf die Sie voraussichtlich Zugriff haben, sollten Ihre Antworten auf die vorherigen Fragen als optimistisch erweisen.

Für ein kleines Projekt würde ich wahrscheinlich die Datenbank ignorieren, die Anwendung als ein einfaches Objektmodell mit User Objekte, die eine List[followers] pflegen. Bewahren Sie alles im RAM für den normalen Betrieb auf und verwenden Sie ein ORM, um regelmäßig in einer Datenbank zu bleiben (wahrscheinlich postgresql oder mysql).

Für ein größeres Projekt würde ich überhaupt keine relationale Datenbank verwenden; aber genau das, was ich verwenden würde, würde von den spezifischen Details des Projekts abhängen.

Wenn Sie nur versuchen, das Konzept zu beschleunigen, gehen Sie mit dem ORM-Ansatz; aber bedenke, dass es nicht skaliert wird.

+0

Würde es Ihnen etwas ausmachen, mich in die Richtung eines einführenden Materials über RAM-Objektspeicher zu führen? Über welche Technologien sprechen wir besonders? So etwas wie Redis? – Chris

+0

Für eine Spitze bedeute ich eigentlich, einfache Datenstrukturen direkt im RAM zu behalten. Unter der Annahme von 100.000 Benutzern mit einem Durchschnitt von 100 Followern und einem einfachen ~ 100-Byte-Objekt pro Benutzer und 4-Byte-Referenzen benötigen Sie nur ~ 40 MB für das Folgediagramm und 10 MB für den Benutzer-DB. Selbst mit einem Indexierungs-Overhead von 3x ist das leicht etwas, das man in RAM einbauen und ohne zu große Schwierigkeiten in einer Datenbank halten kann. – Recurse

4

Das Modell ist ziemlich einfach. Das Problem liegt in der Größe der Subskription Tabelle; Wenn es 1 Million Benutzer gibt und jeder 1000 abonniert, dann hat die Subskription Tabelle 1 Milliarde Zeilen.

alt text http://www.damirsystems.com/dp_images/follower_model.png

+0

schönes Diagramm. Vielen Dank. – user749665

+0

@Damir .. könnten Sie den Sinn von "EnableSubscription" in Ihrem Diagramm erklären? Ist das ein Bool? Wie soll das funktionieren, folgen und folgen? Und warum der Gebrauch eines Bool? Kann man nicht einfach eine Pivot-Tabelle verwenden und die userID sowohl als User als auch als Follower referenzieren?Wird EnableSubcription verwendet, um einem Benutzer zu verbieten, Ihnen zu folgen? – Chriz74