2009-05-30 4 views
0

Was passiert, wenn ich Medien auf meine Website hochlade; Jeder erhält eine Benachrichtigung. Jede Person kann auf eine Box klicken, um sie zu entfernen, und sie wird für immer aus ihrer Nachrichtenwarteschlange entfernt.Der beste Weg, um 10.000 Einfügungen in einer SQL-Datenbank zu tun?

Wenn ich 10.000 Menschen auf meiner Website hatte, wie würde ich es zu jeder Person msg Warteschlange hinzufügen? Ich kann mir vorstellen, dass es viel Zeit in Anspruch nimmt, also würde ich mich für etwas wie ein Dateisystemjournal entscheiden? markieren Sie, dass ich Leute, die Daten dann meine aktuelle Position benachrichtigen muss. Dann aktualisieren Sie meine Position alle 100 Einsätze oder so? Ich würde einen PK auf meiner Beobachterliste brauchen. Wenn sich jemand in der Mitte einträgt, wird meine Bestellung nicht unterbrochen, da ich über PK sortiere.

Ist dies die beste Lösung für ein Massenbenachrichtigungssystem?

-edit-

Diese Seite ist ein Benutzer Content-Website erstellt. Administratoren können globale Nachrichten senden und beliebte Personen können Tausende von Abonnenten haben.

+0

Welche Datenbank-Software verwenden Sie? Läuft es auf einem einzelnen Server oder in einem Master/Slave-Setup oder als Cluster, oder ...?Bitte geben Sie weitere Einzelheiten an. –

+0

Wim: Ich habe eigentlich keine Details. Derzeit habe ich einen Prototyp mit C# und SQLite als DB. –

Antwort

3

Wenn 10000 fügt in eine enge viele zu viele Tabelle verbindet die Empfänger zu den Nachrichten (recipientid, messageid, status) ist langsam, ich nehme an, Sie haben größere Probleme mit Ihrem Design.

Dies ist die Art von Operation würde ich normalerweise nicht einmal über Dosierung oder Menschen in der Mitte der Post Operation abonnieren Sorge - im Grunde:

Unter der Annahme, @publisherid bekannt, @msg auf SQL Server bekannt:

BEGIN TRANSACTION 

INSERT INTO msgs (publisherid, msg) 
VALUES(@publisherid, @msg) 
SET @messageid = SCOPE_IDENTITY() 

INSERT INTO msqqueue (recipientid, messageid, status) 
SELECT subscriberid, @messageid, 0 -- unread 
FROM subscribers 
WHERE subscribers.publisherid = @publisherid 

COMMIT TRANSACTION 
1

Vielleicht einfach für jeden Benutzer notieren, welche Benachrichtigungen sie gesehen haben - also ist der Satz von Benachrichtigungen, die einem Benutzer angezeigt werden, diejenigen, die vor ihrem "frühest_notifiziert" Horizont erstellt wurden (wenn sie registriert wurden, oder vor einer Woche ...) minus diejenigen, die sie anerkannt haben. Auf diese Weise verzögern Sie das Einfügen von Objekten, bis ein einzelner Benutzer gleichzeitig vorhanden ist. Wenn Sie Benutzern nur Nachrichten anzeigen, die weniger als eine Woche alt sind, können Sie die Benachrichtigungsflags löschen, die mindestens eine Woche alt sind.

(Peformance Optimierungshinweis von meinem DBA in meinem alten Job: „Geschäftsprozesse sind die einfachsten Dinge zu ändern, sie zu betrachten zuerst“)

+0

Das klingt wie etwas, das ich tun würde, um eine Struktur zu kopieren (bei Änderung, nicht sofort). Aber wäre das in diesem Fall nicht schlimmer? 10.000 * werde ich * fortlaufend * fragen, ob ich aktualisiert habe? –

+0

Ich sehe nicht, dass es schlimmer ist - wie wollen Sie die Benutzer benachrichtigen, selbst wenn Sie beim Erstellen der Nachricht in eine Benachrichtigungstabelle eingefügt haben - Sie müssen das abgefragt haben? Ja, jeder Benutzer wird etwas tun wie "Wählen Sie ... aus der Nachricht, wo message.created>: horizon und nicht existiert (wählen Sie 1 aus message_read wo message_read.user =: user und message_read.message_id = message.message_id)" . Die Indizes on message (created) und message_read (user_id, message_id) sollten dies zu einer einfachen Abfrage machen. – araqnid

+0

Ich würde die Benutzer msg Warteschlange und nichts anderes auswählen. Ich denke, mein Beitrag ist schlecht, ich bin nicht der Einzige, der Medien hochladen kann. Es ist eine Benutzerinhaltsseite wie youtube. Es wird ein paar Admin geben, die globale Medien und globale Nachrichten zusammen mit populären Leuten veröffentlichen können, die Dutzende von Abonnenten anziehen könnten. Das sind mehrere Orte, an denen Sie anstelle Ihres Mitteilungszentrums pollen können. Ich plante, die Einfügungen zu machen, wenn der Autor sie auslöst (das Hochladen von sendet die msg/Medien). –

0

IMHO Einfügen von Datensätzen kann nicht die effizienteste Lösung für dieses Problem sein. Können Sie ein clientseitiges Cookie verwenden, um zu speichern, ob der Benutzer die Benachrichtigung entfernt hat, oder müssen Sie dies auch dann im Auge behalten, wenn Cookies gelöscht werden? Wenn Sie ein neues Video hochladen, kann die App einfach das Cookie mit der neuen Videoaufzeichnungs-ID vergleichen und entscheiden, ob die Benachrichtigung basierend auf was im Cookie gespeichert ist, ein- oder ausgeblendet wird. Dies wird Ihnen eine Menge Datenbankeinfügungen ersparen und hält die meiste Last auf dem Client.

+0

Ich müsste es auf dem Server verfolgen, aber ist dies nicht nur Verschieben von Einfügungen zu wählen, da jetzt 10000 müssen mich stattdessen abfragen? –

+0

Sie müssen auf jeden Fall noch wählen, wenn sie die Seite laden, um zu sehen, ob ihr Datensatz existiert, um anzuzeigen, dass sie die Benachrichtigung geschlossen haben, es sei denn, mir fehlt etwas. – James

0

Wenn Sie Postgres verwenden, können Sie den Befehl COPY verwenden, die die schnellste Methode von ihnen ist alles:

COPY tablename (col1, col2, col3) FROM '/path/to/tabfile'; 

wo tabfile ist eine TAB-separierte Datei mit vielen Einträgen. Dies wird jedoch fehlschlagen, wenn einige UNIQUE-Einschränkungen vorliegen und in der Datei Duplikate vorhanden sind.

1

Ich würde sagen, lassen Sie einfach die Datenbank kümmern sich um Dinge, die es gut und in der Lage zu tun ist. Einfügen und Verwalten von Daten Versuchen Sie nicht, es in Code zu tun, schreiben Sie einfach die SQL, um die Daten in einem Schritt einzufügen. 10000 Zeilen ist ein Diddle für alle echten Datenbanken.

Verwandte Themen