Ich habe eine Sammlung von Posts
und Users
, wo Benutzer jeden Beitrag up- / downvoten können. Was wäre der beste Weg, dies in einer mongodb-Datenbank zu speichern, um sicherzustellen, dass Benutzer nicht für ein bestimmtes Dokument mehr als einmal abstimmen können?
Die einfachste nosql-ish-Lösung, die ich mir ausgedacht habe, ist das Speichern einer Reihe von user_ids, die innerhalb jedes Post
-Dokuments stimmten (oder sogar ein Array von (user_id, vote)
, wobei vote
+1 oder -1 ist, so dass Benutzer es sein werden können ihre Stimme ändern). Ist es eine gute Idee vom Standpunkt der Performance aus, dass jeder Beitrag tausende von Stimmen haben kann?
Was ist mit wirklich beliebten Websites wie Reddit, wo Top-Beiträge Hunderttausende von Stimmen haben können?
MongoDB-Dokumente sind derzeit auf maximal 16 MB beschränkt. Wenn Gilberts Berechnungen korrekt sind, könnten Sie nicht alle 6 Millionen user_id
s im Dokument Post
speichern.
Sie könnten jedoch erwägen, die Abstimmungen stattdessen im Dokument User
zu speichern (d. h. die post_id
s, für die der jeweilige Benutzer gewählt hat). Es ist viel weniger wahrscheinlich, dass ein Nutzer über 6 Millionen verschiedene Beiträge abstimmt, so dass Sie die Größenbeschränkung nicht so schnell erreichen.
Eine andere Möglichkeit, dies zu handhaben: Wenn Sie viele Stimmen für einen bestimmten Beitrag erwarten, möchten Sie vielleicht die Abstimmungen außerhalb der Post
-Dokumente in einer separaten Sammlung speichern und eine weitere Abfrage durchführen, ähnlich wie viele andere viele Join-Tabelle in SQL-Mode:
und erstellen Sie einen zusammengesetzten Index für (user_id, post_id).
Was ist mit wirklich beliebten Websites wie Reddit, wo Top-Beiträge Hunderttausende von Stimmen haben können?
Was ist mit ihnen? Wenn Sie Ihre Idee in einer relationalen Datenbank verwenden, haben Sie eine Ganzzahl für den Benutzer-ID-Zeiger, eine Ganzzahl für den Post-Zeiger und ein Byte für die Abstimmung. Insgesamt 9 Bytes für jede Stimme.
Sicher, es gibt einen Index-Overhead. Machen Sie es 15 Bytes insgesamt pro Stimme. 6 Millionen Stimmen würden 90 Megabyte Speicherplatz belegen.
Reddit sperrt Posts nach einer gewissen Zeit, so dass sie nicht bearbeitet oder abgestimmt werden können. Reddit muss also nicht für immer einzelne Stimmen speichern. Stimmen Sie nur Summen.
Tags und Links mongodb database-design