Wie könnte man einen News-Feed "freundlich" gestalten, so dass es nicht extrem teuer wäre, alle Elemente (Abfrage) in den News-Feed zu stellen? Der einzige Weg, den ich mir vorstellen kann, wäre, fast jede Tabelle (die Gruppen, Notizen, Freunde usw. repräsentiert) zu vereinigen und die Daten und so weiter zu erhalten. Das scheint eine wirklich teure Abfrage zu sein, die für jeden Benutzer ausgeführt werden muss, und es wäre ziemlich schwierig, so etwas zwischenzuspeichern, da jeder anders ist.
Antworten
Zu viele Anzeigen?Zunächst sollten Sie einen Leistungsprototyp erstellen, um Ihre Vermutung zu überprüfen, dass die Vereinigung zu teuer wäre. Möglicherweise optimieren Sie voreilig etwas, das kein Problem darstellt.
Wenn das ein echtes Problem ist, sollten Sie eine Tabelle ins Auge fassen, die nur für die Ereignisdaten bestimmt ist und die parallel zu den anderen Tabellen aktualisiert werden muss.
Wenn Sie z. B. einen Notizendatensatz erstellen, erstellen Sie auch einen Ereignisdatensatz in der Ereignistabelle mit dem Datum, der Beschreibung und dem beteiligten Benutzer.
Betrachten Sie eine Indizierung der Ereignistabelle basierend auf UserId (oder UserId und Datum). Ziehen Sie auch in Betracht, alte Daten zu löschen, wenn sie nicht mehr benötigt werden.
Dies ist kein normalisiertes Schema, aber es kann schneller sein, wenn das Abrufen eines Ereignis-Feeds ein häufiger Vorgang ist.
Es ist schwer, diese Frage ohne ein Schema zu beantworten, aber meine Vermutung ist, dass eine UNION mit 10 oder mehr richtig indizierten Tabellen nichts ist:
Eine typische LAMP-Anwendung wie WordPress oder PHPBB führt problemlos mehr als 10 Abfragen pro Seitenaufruf aus. Machen Sie sich also keine Sorgen.
UNION = teuer, da die gesamte Ergebnismenge einer DISTINCT-Operation unterzogen wird. UNION ALL = billiger, da es sich effektiv um mehrere Abfragen handelt, deren Ergebnisse jeweils zusammengefügt werden.
Das hängt natürlich von der Datenmenge ab.
Der Hauptfaktor für die Effizienz sind die einzelnen Abfragen, die zusammengeführt werden, aber es gibt keinen Grund, warum die Auswahl der letzten (sagen wir) 10 Datensätze aus jeder der 10 Tabellen mehr als einen kleinen Bruchteil einer Sekunde dauern sollte.