przechowywanie upvotes / downvotes w mongodb

Mam kolekcjęPosts iUsers gdzie użytkownicy mogą głosować / przesyłać wiadomości do każdego posta. Jaki byłby najlepszy sposób przechowywania tego w bazie danych mongodb, aby upewnić się, że użytkownicy nie mogą głosować na dany dokument więcej niż raz?

Najprostszym rozwiązaniem, które wymyśliłem, jest przechowywanie tablicy user_ids, którzy głosowali w każdym z nichPost dokument (lub nawet tablica(user_id, vote) gdzievote to +1 lub -1, dzięki czemu użytkownicy będą mogli zmienić swój głos). Czy to dobry pomysł z punktu widzenia wydajności, ponieważ każdy post może mieć tysiące głosów?

A co z naprawdę popularnymi stronami internetowymi, takimi jak Reddit, w których najwyższe posty mogą mieć setki tysięcy głosów?

 Gorkem Yurtseven17 cze 2013, 21:53
jak byś to zrobił? Próbowałem przechowywać obiektywizm jako klucze, ale to nie działa ..

questionAnswers(2)

QuestionSolution

Dokumenty MongoDB są obecnie ograniczone do maksymalnie 16 MB, więc zakładając, że obliczenia Gilberta są dokładne, nie byłbyś w stanie przechowywać wszystkich 6 milionówuser_ids wPost dokument.

Można jednak rozważyć przechowywanie głosów wUser zamiast tego dokument (tjpost_ids, na które głosował dany użytkownik). Jest znacznie mniej prawdopodobne, że użytkownik głosuje na 6 milionów różnych postów, więc w ten sposób nie osiągniesz limitu rozmiaru tak szybko.

Innym sposobem radzenia sobie z tym: Jeśli spodziewasz się wielu głosów na dany post, możesz zapisać głosy pozaPost dokumenty w osobnej kolekcji i wykonaj dodatkowe zapytanie, podobne do tabeli JOIN wielu do wielu w stylu SQL:

user_votes { user_id: ObjectId(...), post_id: ObjectId(...), vote:-1 }

i utwórz indeks złożony na (id_użytkownika, post_id).

A co z naprawdę popularnymi stronami internetowymi, takimi jak Reddit, w których najwyższe posty mogą mieć setki tysięcy głosów?

Co z nimi? Używając swojego pomysłu w relacyjnej bazie danych, masz liczbę całkowitą dla wskaźnika id użytkownika, liczbę całkowitą dla wskaźnika postu i bajt dla głosowania. Łącznie 9 bajtów na każdy głos.

Jasne, jest jakiś indeks. Zrób to łącznie 15 bajtów na głos. 6 milionów głosów zajęłoby 90 megabajtów miejsca na dysku.

Reddit blokuje posty po pewnym czasie, więc nie można ich edytować ani głosować. Więc Reddit nie musi na zawsze przechowywać indywidualnych głosów. Tylko sumy głosów.

yourAnswerToTheQuestion