Em primeiro lugar, se esse for o esquema real, ele parece estar super normalizado.
- Hotel_Category | Categorias
- Hotel_HotelType | HotelTypes
- Room_RoomType | RoomTypes
- Hotel_Room | Quarto
são todos candidatos para serem unidos pelo emparelhamento. Então, em vez de 8 tabelas, você teria 4. O prefixo duplo em algumas de suas tabelas é uma dica de que a normalização foi levada longe demais.
A normalização prática ou pragmática é sempre um ato de equilíbrio. Nesse caso, acho que você foi longe demais na rota de normalização.
Em seguida, desempenho no lado do banco de dados relacional:
I need to implement a typed search for hotels, which should be able to query on name, city, country, category, hoteltype, roomprice, customtype, room custom type and roomtype or any combination of these criteria.
Desculpas se isso parece pedante, mas existem índices para todos esses elementos, certo? Se o sharding for o molho secreto da escala da web 1 , os índices serão um primeiro passo crítico para garantir que o seu banco de dados relacional possa ser dimensionado. 1 a partir de um vídeo viral parodiando certas razões na seleção do banco de dados. Basta google o termo, mas sei que é um vídeo NSFW.
Depois disso, precisamos analisar os modelos de gravação & leia modelos.
Com um esquema tão pequeno quanto esse, acho que essa abordagem é exagerada, especialmente se você não desnormalizar o esquema fornecido na pergunta. Tomar esse caminho é apenas adicionar gasolina a um fogo já quente - tudo o que você terá conseguido é diminuir o seu aplicativo mais rapidamente devido à complexidade.
Isso não quer dizer que as visualizações somente leitura não valeriam a pena considerar após reduzir o esquema. Pensando nas maneiras pelas quais as pessoas podem consultar salas, você pode criar visualizações por local + nome, local + preço, local + tipo, etc ...
O ideal é que você tenha métricas do uso existente para determinar quais visualizações você deve criar. Mas parece que você entende o domínio bem o suficiente para que você possa adivinhar com quais deles começar.
Finalmente, considere uma abordagem noSQL. E há uma razão pela qual eu levanto isso por último.
Se você não tentar nenhuma das opções acima, sua implementação noSQL terá um desempenho significativamente pior do que sua solução de banco de dados relacional existente. O maior desafio será o número de junções que você tem em suas consultas. Embora não seja provável que você tenha muitas junções complexas, os sistemas noSQL funcionam melhor com pouca ou nenhuma junção nas consultas.
Se você reduzir seu esquema como sugerido no primeiro segmento, poderá ter uma boa chance de migrar para o noSQL. Eu provavelmente colapsaria Hotel
, Country
, Room
e Room_Type
em uma tabela. Isso deixaria junções simples de lá contra Hotel_Category
e Hotel_Type
, mas suponho que essas duas tabelas sejam usadas com menos frequência ao encontrar salas.
Juntamente com o recolhimento do esquema, você precisará indexar os principais elementos com os quais deseja pesquisar. Talvez ainda mais do que os DBs relacionais, a abordagem noSQL depende muito do índice pré-construído para encontrar as informações de que você precisa rapidamente.
Notas de inicialização:
Na medida em que seria mais rápido (relacional versus noSQL), eu realmente não sei e eu não acho que ninguém poderia saber até que você tenha gasto algum tempo construindo e ajustando ambos. Trabalhar em um não se aplica ao outro, então você tem que dobrar seu esforço para realmente responder a essa parte da sua pergunta. Se você já investiu no lado relacional, não vejo nada de interessante em sua pergunta para mudar para o noSQL.
A pesquisa difusa pode ser um desafio, independentemente do tipo de banco de dados subjacente. A melhor coisa que você pode fazer aqui é examinar as opções fornecidas pela plataforma escolhida e começar a tentar implementar a pesquisa difusa. Perfil isso; continue revisando; e veja onde suas iterações levam você.