MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

mongo db design di follower e feed, dove dovrei incorporare?

In generale, è una cattiva idea incorporare relazioni di seguito/seguito da nei documenti dell'utente, per diversi motivi:

(1) esiste un limite massimo per la dimensione del documento di 16 MB ed è plausibile che un utente popolare di un sito ben abbonato possa finire con centinaia di migliaia di follower, che si avvicineranno alla dimensione massima del documento,

(2) le relazioni di followership cambiano frequentemente, quindi il caso in cui un utente guadagna molti follower si traduce in una crescita ripetuta del documento se stai incorporando follower. La crescita frequente dei documenti ostacolerà in modo significativo le prestazioni di MongoDB, quindi dovrebbe essere evitata (la crescita occasionale dei documenti, in particolare se i documenti tendono a raggiungere una dimensione finale stabile, è meno penalizzante per le prestazioni).

Quindi, sì, è meglio suddividere la relazione seguente/seguito da in una raccolta separata di record, ciascuno con due campi, ad esempio { _id :, oid :}, con indici su _id (per "chi sto seguendo? " query) e oid (per la query "chi mi sta seguendo?"). Qualsiasi modifica di stato individuale è modellata da un'aggiunta o rimozione di un singolo documento, anche se se visualizzi anche elementi come il conteggio dei follower, probabilmente dovresti tenere contatori separati che aggiorni dopo qualsiasi inserimento/cancellazione di bordi.

(Naturalmente, questo presuppone che i tuoi requisiti aziendali ti consentano una certa flessibilità sui dettagli di coerenza:in generale, se il tuo codice di visualizzazione dice a un utente che ha 304 follower e quindi procede a enumerarli, solo l'utente più esigente verificherà che i follower siano enumerati fino a 304. Se i requisiti aziendali richiedono una coerenza assoluta, avrai bisogno di un database che isoli le transazioni per te, oppure dovrai contare tu stesso come parte della visualizzazione di tutte le identità degli utenti.)