Ai fini della discussione consideriamo uno scenario di FourSquare.
Scenario
Entità:
- utenti
- posti
rapporti:
- Check-in: utenti <-> luoghi, molti a molti
- Amici: utenti <-> utenti, molti a molti
Progettazione di database
Molto probabilmente questi avranno errori, per favore segnalali.
RDBMS
tabelle:
- utenti
- posti
- Check-in (svincolo)
- Amici (incrocio)
Professionisti:
- PAC: coerenza, disponibilità
Contro:
- CAP: tolleranza di partizione, aka sharding
- schemi = struttura non flessibile
- scarsa replica?
Grafico
Oggetti:
- utenti
- posti
bordi:
- Amici: Utente <-> Utente
- Check-in: Utente -> Luoghi
- contiene il timestamp
Professionisti:
- PAC: coerenza, disponibilità?
- oggetti e bordi schematici e facilmente mutabili
- query di attraversamento di grafici, ad esempio:
- il clustering
- trovare gruppi di amici
- trovare ristoranti che piacciono a persone simili
- altre domande comuni / utili?
- il clustering
Contro:
- CAP: tolleranza partizione?
Documento / Oggetto
3 database separati?
- utenti
- lista di amici
- checkin
- timestamp
- utente
- posto
- posti
Professionisti:
- CAP: disponibilità, tolleranza della partizione
- oggetti schematici e facilmente mutabili
Contro:
- PAC: coerenza
Domande
Per la cronaca, hanno finito per usare MongoDB. Oltre a tutti quei punti interrogativi sopra:
- Non sono sicuro di come implementare un database di documenti.
- In che modo i database dei documenti ottengono la tolleranza della partizione?
- Per ottenere i check-in di un singolo utente, suppongo che l'operazione analizzerebbe tutti i check-in e filtrerebbe i metadati per nome utente (mappa + filtro). Le prestazioni di analisi di oltre 1.000.000 di documenti per ciascun utente sarebbero terribilmente scadenti. Presumo che questo non sia il comportamento corretto?
- Quali altri vantaggi / svantaggi ci sono?