Dato il seguente modello relazionale:
Devo implementare una ricerca digitata per gli hotel, che dovrebbe essere in grado di eseguire query su nome, città, paese, categoria, tipo di hotel, prezzo della camera, tipo di carattere personalizzato, tipo di camera e tipo di camera o qualsiasi combinazione di questi criteri.
Al momento sto facendo ciò nonostante Entity Framework, costruendo dinamicamente una query sull'entità Hotel (IQueryable). Questo va bene perché attualmente ci sono pochissimi dati. Tuttavia, questo non è molto scalabile e quando ci sono molti dati questo diventerà molto lento in quanto si tratta di una query su 10 tabelle. Nota che ho solo bisogno di caricare i dati dell'hotel, non l'intero grafico.
Sto pensando a modi per migliorare la scalabilità di questa parte. Ho esaminato le soluzioni CQRS e forse NoSQL.
Un approccio che avevo in mente è quello di avere questo modello sul lato scrittura (per rafforzare la coerenza) e avere un modello diverso sul lato di lettura. Su scrivere, vorrei quindi aggiornare il modello di lettura (viewmodel).
Tuttavia, poiché questo è già un modello più o meno complesso in termini di relazioni, vedo alcuni problemi con questo:
- L'aggiornamento dei metadati (come categoria, tipo di camera, tipo di hotel) richiederebbe l'aggiornamento di tutti gli hotel o stanze del modello di lettura. Questo potrebbe essere piuttosto lento o impossibile una volta che ci sono molti dati.
- Supponiamo che io usi un database di documenti come MongoDB e salvi un hotel con tutti gli elementi correlati denormalizzati, la query su quella tabella non sarà lenta in quanto deve cercare all'interno di ciascun documento, o è ancora abbastanza veloce in NoSQL?
Per riassumere alcune domande:
- La denormalizzazione di questo modello è l'approccio giusto e quale sarebbe il modo migliore?
- Will NoSQL sarà più veloce?
- Esistono approcci migliori che posso seguire o modi per suddividere la relazione e appiattire la gerarchia, pur continuando a eseguire una ricerca digitata?
- Idealmente alcuni campi dovrebbero anche supportare la ricerca fuzzy, quale sarebbe il modo migliore per farlo?