2009-07-06 14 views
1

Ich möchte ein Forum von Grund auf mit speziellen Bedürfnissen und Anpassung entwickeln.Der beste Ansatz zum Cache Zählt aus SQL-Tabellen?

Ich möchte mein Forum für die intensive Nutzung vorbereiten und fragen, wie Dinge wie Benutzer Beiträge zählen und Benutzer Antworten zählen.

Mit nur drei Tabellen, tblForum, tblForumTopics, tblForumReplies, was ist der beste Ansatz zum Zwischenspeichern der Benutzer Themen und Antworten zählt?

Denken Sie an ein einfaches Szenario: Benutzer drücken Sie einen Link und öffnen Sie die Antworten.aspx? Id = x & Seite = y Seite, und starten Sie das Lesen der Antworten. Auf der HTTP-Anforderung führt der Server einen SQL-Befehl aus, der alle Antworten für diese Seite abruft, sowie "innere Verbindung mit tblForumReplies, um die Anzahl der Benutzerantworten für jeden beantworteten Benutzer herauszufinden."

select 
    tblForumReplies.*, 
    tblFR.TotalReplies 
from 
    tblForumReplies 
    inner join 
    (
     select IdRepliedBy, count(*) as TotalReplies 
     from tblForumReplies 
     group by IdRepliedBy 
    ) as tblFR 
    on tblFR.IdRepliedBy = tblForumReplies.IdRepliedBy 

Leider ist dieser Ansatz sehr CPU-intensiv, und ich möchte Ihre Ideen, um zu sehen, wie die Dinge wie Tabelle Counts zwischenzuspeichern.

Wenn Zählen Antworten für jeden Benutzer beim Einfügen/Löschen, und speichern Sie es in einem separaten Feld, wie man mit manuellen Daten ändern zu synchronisieren. Angenommen, ich lösche die Antworten manuell aus SQL.

Antwort

3

Dies sind die drei Ansätze, die ich denken würde:

1) Vielleicht Performance SQL Server wird gut genug, dass man nicht zu Cache brauchen. Sie könnten unterschätzt werden, wie gut SQL Server seine Arbeit machen kann. Wenn Sie Ihre Joins richtig machen, ist es nur eine Abfrage, um alle Zählungen aller Benutzer zu erhalten, die sich in diesem Thread befinden. Wenn Sie dies als eine Abfrage pro Benutzer betrachten, ist das falsch.

2) Nicht zwischenspeichern. Speichern Sie die Benutzeranzahl redundant in der Benutzertabelle. Aktualisieren Sie die Benutzerzeile, wenn ein Beitrag eingefügt oder gelöscht wird.

3) Wenn Sie Tausende von Benutzern haben, sogar viele tausend, aber nicht Millionen, können Sie Benutzer und deren Anzahl im Speicher der Webschicht zwischenspeichern - für ASP.NET den Cache "Application".

2

Ich würde nicht mit Caching kümmern, bis ich das sicher brauchen werde. Aus meiner Erfahrung ist dies keine Möglichkeit, Orte vorherzusagen, die Caching benötigen. Versuchen Sie iterativen Ansatz, versuchen Sie, ohne Cashe zu implementieren, dann Statistiken zusammen und implementieren Sie dann richtiges Caching (es gibt viele Arten wie Inhalt, Daten, Aggregate, verteilt und so weiter).

BTW, ich glaube nicht, dass Ihre Abfrage CPU verbraucht. SQL Server wird das Zeug optimieren und COUNT (*) wird in Ticks ausgeführt ...

1

tbl Präfixe saugen - so viel wie Replies.aspx?id=x&page=y URIs tun. Betrachten Sie ASP.NET MVC oder nur Routing-Teil.

Zweitens, nicht vorzeitig optimieren. Wenn Sie dies jedoch wirklich benötigen, denormalisieren Sie Ihre Daten: Fügen Sie die TotalReplies Spalte zu Ihrer ForumTopics Tabelle hinzu und verlassen Sie sich entweder auf Ihre DAL/BL, um dieses Feld auf dem neuesten Stand zu halten (möglicherweise mit einer geplanten Aufgabe, diese zu synchronisieren), oder verwenden Sie Trigger.

1

Für jede Antwort müssen Sie TotalReplies und TotalDirectReplies behalten. Auf diese Weise können Sie die baumartige Struktur von Antworten unterstützen und die Aktualisierung von Zählwerten in der gesamten Hierarchie beibehalten, ohne jedes Mal neu zählen zu müssen.

Verwandte Themen