schema MongoDB per le corrispondenze di tracciamento

2

Questa è la prima applicazione mongo-backed che sto cercando di fare al di là dei tutorial, quindi mi manca l'immaginazione quando si tratta di schemi di documenti.

Contesto :

In un'applicazione di datazione, esiste un algoritmo che identifica le corrispondenze tra gli utenti. Attualmente sto cercando di identificare come devono essere memorizzate queste corrispondenze.

Schema corrente :

Crea due documenti Match per coppia (uno per ogni utente), ognuno conterrà la risposta del suo utente, un riferimento all'altro utente e l'id del suo documento associato:

Match : {
  objectid: [unique uuid],
  user: [idx, uuid],
  targetUser: [reference to User],
  pair: [Match uuid],
  approved: [bool / null]
}

Usecase :

Algorithm crea gli oggetti match. Viene effettuata una richiesta per recuperare tutte le potenziali corrispondenze User , interroghiamo il database per tutti gli oggetti Match per User , dove approvato è null . Il database popolerà il campo targetUser con il documento User effettivo [!!!] e restituirà. I risultati sono serializzati e inviati indietro.

...

L'utente approva la corrispondenza, la richiesta inviata all'aggiornamento Match[objectid].approved = True . Il back-end controlla il valore del secondo oggetto Match a cui fa riferimento pair e quindi attiva altre azioni a seconda del valore.

Preoccupazioni :

Prima di tutto, per qualcuno più esperto di NoSQL questo potrebbe sembrare orribile, nel qual caso per favore dimmelo. La mia preoccupazione principale è avere il riferimento a targetUser . Un grande punto di forza di NoSQL sta riducendo il numero di "join", ma non riesco a trovare un modo per evitarlo qui. Inoltre, il fatto di avere due oggetti per una coppia è un po 'preoccupante. Ma in quale altro modo direi: give me all potential matches for User A ?

    
posta latusaki 01.03.2017 - 12:51
fonte

1 risposta

4

Quando progetti gli schemi di database per MongoDB, il criterio decisionale numero uno non è "come sono strutturati i miei dati?" ma piuttosto "quali query voglio eseguire sui miei dati?". Lo schema dei dati dovrebbe quindi essere strutturato in modo che tutti i casi d'uso rilevanti per le prestazioni possano essere soddisfatti con una singola query.

Se la tua query più importante è "ottieni un utente specifico con tutte le corrispondenze non approvate", allora dovresti avere un campo di array unapproved_matches nel documento utente con tutti i documenti Match non approvati per quell'utente. Questi documenti secondari devono essere compilati con tutti i dati che desideri mostrare sul frontend. Pertanto, anziché limitarti a fare riferimento al documento dell'altro utente, probabilmente includerai nome, età, posizione, URL del profilo e / o URL dell'immagine del profilo.

Ciò significa che un documento di corrispondenza individuale potrebbe esistere più volte nel tuo database, due volte in users -collection come sotto-documenti dei due utenti che devono approvarlo / rifiutarlo e (se c'è un uso per che) ancora un'altra volta come una voce nella raccolta globale matches . Avrai anche alcune informazioni che sono duplicate tra il documento dell'utente e i documenti di corrispondenza che corrispondono a quell'utente.

Questo potrebbe sembrare abbastanza eretico per chi è abituato a lavorare con i database relazionali. Ma il database con cui stai lavorando non è relazionale. Quindi dimentica tutto Raymond F. Boyce e Edgar F. Codd ti hanno parlato della normalizzazione dei dati. La duplicazione dei dati non è necessariamente una brutta cosa in MongoDB. Il prezzo che si paga per evitare i JOIN è che spesso non si ottiene riduzioni di personale.

    
risposta data 01.03.2017 - 15:04
fonte

Leggi altre domande sui tag