Nella nostra azienda, mi è stato affidato il compito di sviluppare un'applicazione mobile (iOS, Android e in futuro, forse Windows). Con questi dispositivi, è probabile che avremo un numero elevato di installazioni distribuite su tutti questi dispositivi.
Certamente, per un'applicazione mobile è molto importante essere reattivi, quindi abbiamo deciso di passare da un ambiente SQL classico (SQL Server) a una soluzione No-Sql (MongoDB).
Abbiamo scelto questo approccio perché la piattaforma è altamente scalabile e può tornarti utile in futuro.
Devi sapere che sono totalmente nuovo alla storia No-Sql, quindi non dare la colpa a eventuali domande stupide, sono qui per imparare le migliori pratiche.
Iniziamo esaminando i dati che devo importare.
L'applicazione che la nostra azienda sta sviluppando è un'applicazione per sfogliare un catalogo di articoli potenzialmente acquistabili. Esiste una gerarchia specifica di quegli articoli che cercherò di spiegare nell'immagine seguente:
Perspiegarel'immaginesopraunpo'inparole:
1hannounaclassificazionealivellodiroot(peresempio-articolidacucina),inbaseallaqualepossoavere(nonobbligatorio)un'altraclassificazione(adesempiocoltelli).Questovaleper4livellidiprofondità.
Sottoogniclassificazionepossoavereungruppodiarticoli,(adesempio:coltello,acciaio,nero),epoisottoognigruppodiarticoli,hosemprealcuniarticoli(peresempio:lama:20cm,lama:22cm,lama24cm).
Perdartiun'ideadelcoltello,vediilseguenteJson(cercheròdispiegarlonelmodomigliorepossibile):
{"Name":"Kitchen",
"Classifications":[
{
"Name":"Knives",
"Article Groups":[
{
"Name":"Knive Steel Black",
"Articles":[
{
"ArticleGTIN":"684351654984"
}
]
}
]
}
]
}
Questo è approssimativamente il modo in cui i dati sono strutturati. Un'altra cosa che è molto importante è che gli articoli possono avere più proprietà.
Di seguito è riportato un frammento di un solo articolo con alcune proprietà su di esso:
{
"ArticleGTIN":"984651164",
"Properties":[
{
"Name":"Length",
"Value":"20cm",
},
{
"Name":"Hardness",
"Value":"1",
}
]
}
Ora, per l'applicazione, ho bisogno di essere in grado attraverso il catalogo, quindi:
- Visualizzazione di tutte le classificazioni a livello di root.
- Se è selezionata una classificazione, guarda tutte le classificazioni dei bambini.
- Per ogni una classificazione, ho bisogno di poter visualizzare i gruppi di articoli.
- Per ciascun gruppo di articoli, devo essere in grado di visualizzare gli articoli.
- Più importante: devo essere in grado di filtrare tutte le proprietà date per un esempio. Con questo voglio dire che devo essere in grado di dire: trovami tutti i coltelli con una durezza > = 2 e dove la lunghezza è di almeno 10 cm (penso che tu abbia capito il punto). È una specie di filtro come la ricerca su Amazon:
Ilproblemachestoaffrontandoèchenonsoesattamentecomedovreimemorizzareimieidatipermantenerelamiaapplicazioneilpiùperformantepossibile.Hoinmenteunpaiodiopzioni:
Unagranderaccoltadenominata"Classificazioni" in cui tutto è archiviato. Quindi, un nodo 'genitore' e tutti i nodi figli sotto di esso (vedi diagramma sopra).
-
Molte piccole raccolte con ogni voce in una raccolta che fa riferimento a un'altra collezione, ad esempio una raccolta con classificazioni e quindi un'altra raccolta con gruppi di articoli. Ogni gruppo di articoli contiene un riferimento (basato su un campo "Id" con la classificazione corretta).
-
Crea raccolte che corrispondono ai dati esposti sull'applicazione. Ad esempio la ricerca, posso creare una collezione con solo articoli e le loro proprietà specificate.
-
...
Spero che qualcuno possa dare una risposta su ciò che è più adatto qui.
Un'altra cosa su cui sto cercando una risposta. Per utilizzare l'applicazione, è necessario essere autenticati. Per questo stavo usando Microsoft Authentication Framework (Entity Framework, SQL Server). È meglio mantenere questo, e quindi mescolare SQL Server e MongoDB o è meglio memorizzare tutto in un'unica tecnologia di database?
Nota: sto cercando fatti e best practice. Per favore includi un perché o perché no nella tua risposta in modo che io possa fare la migliore decodifica in base alle risposte date.