No momento, estamos rodando com recursos limitados com nossa solução baseada em servidor mssql.
Agora temos muitas opções tradicionais em relação ao próximo passo para lidar com a carga:
- compre CPUs e IO mais rápidos
- dividir alguns clientes para separar o servidor
- mover db para o cluster
Todos são caros em termos de licenciamento e hardware ou tempo. Portanto, quero adicionar outra opção, movendo todo o sistema para uma solução escalável que o nosql engine cassandra promete.
No entanto, não tenho certeza e não tenho experiência com bancos de dados noSQL, portanto, preciso entender a estrutura dos dados "não estruturados".
Em nosso aplicativo, basicamente armazenamos os dados inseridos pelos usuários de várias maneiras como listas de "valores-chave". Há uma tabela pai, que contém o elemento principal (como um Pedido) e uma tabela filho com os pares de valores-chave que compreendem o conteúdo do pedido (como Order_Lines).
Em termos de negócios, Order e OrderLines são uma unidade. Porém, devido ao RDBMS, eles são armazenados em tabelas e devem ser unidos o tempo todo.
Durante as operações, às vezes escolhemos carregar apenas a parte superior, mas na maioria das vezes carregamos a linha principal + alguns KVPs para exibir algumas informações úteis.
Por exemplo, em uma lista de visão geral, mostramos o identificador de cabeçalho + alguns valores nas colunas de cada linha.
ATUALIZAÇÃO: Armazenamos formas de qualquer tipo. Então, basicamente nós armazenamos "documentos". No entanto, precisamos preparar e pesquisar esses formulários por qualquer valor, tipo, etc. O controle de acesso a dados adiciona outra camada de compexidade ao banco de dados.
Como você pode imaginar, a quantidade e a disponibilidade de determinados KVPs variam de objeto para objeto. Não há possibilidade válida de criar tabelas únicas para cada tipo de objeto, pois teríamos que criar milhares de tabelas para as diferentes combinações de dados.
Esse tipo de "dicionário", como conjuntos de dados, seria melhor armazenado em um banco de dados noSQL? E teremos benefícios de desempenho com isso? Cassandra modelaria esses head + KVPs como um conjunto de dados? Olhando para a página da web do cassandra e alguns tutoriais, tenho a impressão de que não há muita diferença entre nosso RDBMS e o cassandra em termos de organização de dados - deixando-nos a mesma quantidade enorme de junções se você quiser selecionar 5 KVPs para uma lista para cada linha.
A iluminação é bem-vinda, também há indicações de artigos que explicam os problemas.
Apesar do mainstream das bases de dados noSQL IMHO, a decisão sobre a adoção dessa tecnologia deve ser tomada de acordo com as realizações necessárias de acordo com as informações armazenadas, não apenas atendendo ao desempenho que você tem atualmente. Isso significa que talvez sua melhor opção seja manter o banco de dados SQL e melhorar seu HW.
Além disso, li algo na sua pergunta que me fez pensar. Não há muito sobre o status atual do seu banco de dados, mas sua frase "nós basicamente armazenamos os dados inseridos pelos usuários de várias maneiras como listas de" valores-chave "" me faz pensar se o problema não seria um modelo de dados ruim, e não a falta de recursos físicos. Eu gerenciei tabelas realmente grandes (+10 bilhões de linhas) com desempenho incrível em bancos de dados SQL "tradicionais".
Não estou dizendo que está errado, apenas, pois é claro que não posso avaliá-lo no modelo de dados certo com tão pouca informação sobre sua solução atual, mas pense em revisitar seu modelo de dados como uma opção adicional junto com o resto, pois você pode encontrar alguma pista arranhando lá.
Geralmente, as listas de valores-chave são excelentes como compensação quando você não pode implementar o modelo em seu estado final, porque você não conhece as diferentes chaves que terá de enfrentar ou quando precisará dos valores de uma das opções possíveis. teclas para um determinado elemento. Mas, quando implementado, geralmente gosto de repensar essas decisões depois de um tempo, quando você reuniu quantidade suficiente de informações para identificar o caso comum de uso e decidir se a decisão do modelo de dados é a melhor. Se você sabe que terá um certo número de chaves, tente fazer um benchmark com o design de uma tabela regular da maneira tradicional
... e adicionando os índices correspondentes. Experimente e meça os planos de execução com as duas abordagens. Você pode se surpreender especialmente se reunir mais de uma chave de cada vez, pois, entre outras vantagens, o tamanho do bloco de dados deve ser reduzido e, portanto, o desempenho seria melhorado.
Espero que isso ajude, ou pelo menos amplie as possibilidades e abra uma nova linha de investigação.
fonte