MongoDB: replica dei dati nei documenti rispetto a "join"

0

Dichiarazione di non responsabilità: questa è una domanda derivata da questo .

Che cosa pensi del seguente esempio di caso d'uso?

  1. Ho una tabella contenente gli ordini.
  2. Questi ordini hanno molte informazioni correlate necessarie per le mie query correnti (pensate ai prodotti, le informazioni sull'acquirente, la regione, il paese e lo stato del punto vendita e così via)
  3. Per pensare con un approccio de-normalizzato, non devo inserire identificatori di questi articoli correlati nella mia raccolta di ordini principale. Invece, devo ripetere tutte le informazioni per ogni ordine (ad esempio: ripeterò il nome dell'acquirente, il cognome, ecc. Per ciascuno dei suoi ordini).

Supponendo la premessa precedente, mi sto impegnando a mantenere tutti i dati relativi a un ordine senza molti aggiornamenti (perché se modifico il nome dell'acquirente, dovrò ripetere tutte le ordini che aggiornano quelli effettuati dallo stesso acquirente e come blocchi MongoDB a livello di documento sugli aggiornamenti, bloccerei l'intero ordine al momento dell'aggiornamento).

Questo solleva le seguenti domande:

  1. Devo replicare tutti i dati relativi ai prodotti? (es .: categoria, creatore e attributi opzionali come colore, dimensioni ...)
  2. Che cosa succede se viene richiesta una nuova funzionalità e devo effettuare molte query con i prodotti "come punto di ingresso della query"? (es .: rapporti che mostrano il raggruppamento delle prestazioni di vendita dei prodotti per regione, paese o altro)
    1. È abbastanza giusto applicare l'operazione $ unwind alla raccolta originale dei miei ordini? (E le prestazioni?)
    2. Dovrei fare un'altra raccolta con queste domande in mente e replicare di nuovo tutte le informazioni dei prodotti (e i loro ordini)?
    3. Non sarebbe meglio memorizzare un product_id nella raccolta ordini originale per essere più tollerabile alle modifiche dei requisiti? (Che dire dell'emulazione di JOIN?)
  3. L'approccio ottimale sarebbe una soluzione mista con un sistema RDBMS come MySQL per recuperare i dati completi?
    • Voglio dire: memorizzare prodotti, utenti e identificatori di posizione nella raccolta ordini e avere query in MySQL come getAllUsersDataByIds in cui eseguirò un SELECT * FROM users WHERE user_id IN ( :identifiers_retrieved_from_the_mongodb_query )
posta Javier Ferrer González 30.04.2014 - 09:05
fonte

1 risposta

1

Per ottenere informazioni simili ai join dal tuo modello, (come le statistiche sui prodotti), puoi anche fare una di queste due cose:

  • crea una raccolta prodotti_statistica separata che viene aggiornata con le informazioni necessarie ogni volta che un ordine viene salvato / aggiornato nel db
  • crea un'operazione di riduzione della mappa che calcola le informazioni necessarie per i prodotti (prende gli ordini, per ogni prodotto in ogni ordine conta le statistiche x, y, z per quel prodotto). L'integrazione di Mongo con Hadoop può aumentare notevolmente le prestazioni in questo caso (controlla qui )
risposta data 30.04.2014 - 10:33
fonte

Leggi altre domande sui tag