Ho le seguenti entità:
Dati:
- user_id
- Categorie: Interessi, Disinteressi, Categorie A, B C ...
- Ogni categoria ha sottocategorie: Interessi = Gioco, Fisica, Programmazione ecc.
- Ora ogni utente potrebbe appartenere a più sottocategorie.
- Quindi esiste una relazione M: N tra categorie e utenti.
Scala:
- 1 miliardo di utenti
- 100 categorie possono avere sottocategorie che vanno da 100 a 10.000
Operazioni necessarie
-
Lettura e scrittura batch: selezione e proiezione date user_id. Per esempio. Ottieni tutti gli interessi dell'utente A
-
Lettura e scrittura in tempo reale: ho bisogno di richiamare tutti gli utenti per un determinato campo come Interesse: Giochi.
Design corrente
Ho usato file separati per ogni sottocategoria contenente un elenco di utenti. Il server Redis ha coppie di valori-chiave come
<userId_InterestId:games,programming>
Tuttavia questo design ha molte limitazioni, come i tempi di accesso lenti dovuti alle operazioni del disco per ottenere tutti gli utenti per una determinata categoria. Numero enorme di chiavi in Redis, ovvero numero di ( utenti * numero di sottocategorie ).
Ho bisogno di un cambio di design
Il piano attuale è quello di utilizzare MongoDb per mantenere i dati gerarchici per l'utente < - > mappatura delle categorie.
<User_id, Interests, A, B, C>.
Ogni categoria avrà campi figli. Dal momento che MongoDB è in memoria, l'accesso ai DB utilizzando user_id dovrebbe essere più veloce, giusto? Ma che ne dici di una query inversa dove specifichi Interessi :: Programmazione come chiave? C'è un modo migliore per progettarlo?