Vota l'architettura del database

1

Voglio creare un'app utilizzando MongoDB (database NoSQL) che consente alle persone di votare sui post (da simillar a Reddit). Qual è il modo consigliato per memorizzare voti per gli utenti?

Probabilmente la struttura del database dovrà rispondere rapidamente a domande come:

Scrivi:

  • Voti dell'utente X (su o giù) post A.

Leggi:

  • L'utente X ha già votato per il post A?
  • Quanti voti (su-giù) il post A ha?
  • Ottieni post ordinati per conteggio voti (post principali)

Stavo pensando di salvare tutti i voti nel documento Utente, quindi ogni utente ha un elenco di voti con la struttura { voteID, postID, value } , dove value può essere 1 per upvote e -1 per downvote.

Ho letto che questo va bene perché di solito i post possono avere centinaia di migliaia di voti, ma ogni utente di solito ha meno voti di così, quindi i voti sono distribuiti meglio attraverso i documenti.

Stavo anche pensando di mettere in cache il conteggio dei voti per post, quindi ho un po 'come un gancio, ogni volta che un voto viene aggiunto / rimosso il conteggio per quel documento specifico viene anche aggiornato. Un problema che vedo è che se metti / elimina un utente con 10k di voti, dovrai eseguire operazioni di aggiornamento 10k sui post per aggiornare il conteggio dei voti.

Qual è il modo consigliato di memorizzare voti / Mi piace in un database NoSQL?

    
posta Cristy 21.10.2017 - 13:07
fonte

1 risposta

2

Se memorizzi i voti solo nell'oggetto Utente, quando visualizzi una pagina dovrai interrogare ogni oggetto utente per vedere quanti voti ha ogni post se stai cercando di ordinare per voti totali.

Se fossi in me, probabilmente conserverei i voti nell'oggetto post o nella propria collezione. Probabilmente inizi con il primo fino a quando deciderò che non può funzionare per qualche motivo.

Nell'oggetto post, vorrei creare uno schema di voto che includa cose come la data aggiunta, l'id utente, il valore. Dico valore piuttosto che voto alto o basso perché mi consente di impostarlo su 1, 0 o -1 se lo desidero. Anche se forse non è necessario per il tuo caso d'uso, renderebbe più facile tenere traccia del fatto che un utente una volta ha votato una cosa e poi ha cambiato il suo voto in seguito (ad esempio annullando un upvote). Mi consentirà inoltre di assegnare altri valori a un voto, se lo desidera (ad esempio, un utente potrebbe commettere punti di reputazione a un voto).

Facendolo in questo modo, inoltre, vediamo subito quali sono i voti totali per ogni post, così posso cercare solo i voti visualizzati per vedere se l'utente corrente vota su una determinata cosa e su cosa è stato votato dagli utenti.

Come nota a margine, il team che ha scritto la piattaforma Discourse ha fatto alcuni commenti approfonditi sul voto e ha una strong avversione per i downvotes per una serie di motivi. Potrebbe anche valere la pena di pensarci.

    
risposta data 21.10.2017 - 14:04
fonte