Embora a linguagem de consulta do Cassandra seja semelhante à linguagem SQL, seus métodos de modelagem de dados são totalmente diferentes.
No Cassandra, um modelo de dados ruim pode degradar o desempenho, especialmente quando os usuários tentam implementar os conceitos de RDBMS no Cassandra. É melhor ter em mente algumas regras detalhadas a seguir.
Neste tutorial, você aprenderá-
- Regras do modelo de dados Cassandra
- Modele seus dados no Cassandra
- Lidando com relacionamento um para um
- Lidando com um para muitos relacionamentos
- Tratamento de relacionamento de muitos para muitos
Regras do modelo de dados Cassandra
Em Cassandra, as gravações não são caras. O Cassandra não suporta junções, agrupamento por, cláusula OR, agregações, etc. Portanto, você deve armazenar seus dados de forma que possam ser completamente recuperados. Portanto, essas regras devem ser mantidas em mente ao modelar dados no Cassandra.
- Maximize o número de gravações
Em Cassandra, escrever é muito barato. Cassandra é otimizado para alto desempenho de gravação. Portanto, tente maximizar suas gravações para melhor desempenho de leitura e disponibilidade de dados. Existe uma compensação entre a gravação de dados e a leitura de dados. Portanto, otimize o desempenho de leitura de dados maximizando o número de gravações de dados.
- Maximize a Duplicação de Dados
A desnormalização e a duplicação de dados são padrões do Cassandra. O espaço em disco não é mais caro do que a memória, o processamento da CPU e a operação de E / S. Como o Cassandra é um banco de dados distribuído, a duplicação de dados fornece disponibilidade instantânea de dados e nenhum ponto único de falha.
Metas de modelagem de dados
Você deve seguir os objetivos ao modelar dados no Cassandra.
- Espalhe os dados uniformemente pelo cluster
Você deseja uma quantidade igual de dados em cada nó do cluster Cassandra. Os dados são espalhados para nós diferentes com base nas chaves de partição que são a primeira parte da chave primária. Portanto, tente escolher inteiros como uma chave primária para espalhar os dados uniformemente pelo cluster.
- Minimize o número de partições lidas durante a consulta de dados
Partição é um grupo de registros com a mesma chave de partição. Quando a consulta de leitura é emitida, ela coleta dados de nós diferentes de partições diferentes.
Se houver muitas partições, todas essas partições precisam ser visitadas para coletar os dados da consulta.
Isso não significa que as partições não devam ser criadas. Se seus dados forem muito grandes, você não pode manter essa grande quantidade de dados em uma única partição. A partição única ficará mais lenta.
Portanto, tente escolher um número equilibrado de partições.
Boa chave primária
Vamos dar um exemplo e descobrir qual chave primária é boa.
Aqui está a tabela MusicPlaylist.
Create table MusicPlaylist(SongId int,SongName text,Year int,Singer text,Primary key(SongId, SongName));
No exemplo acima, a tabela MusicPlaylist,
- Songid é a chave de partição e
- SongName é a coluna de agrupamento
- Os dados serão agrupados com base no SongName. Apenas uma partição será criada com o SongId. Não haverá nenhuma outra partição na tabela MusicPlaylist.
A recuperação de dados será lenta por este modelo de dados devido à chave primária inválida.
Aqui está outra mesa MusicPlaylist.
Create table MusicPlaylist(SongId int,SongName text,Year int,Singer text,Primary key((SongId, Year), SongName));
No exemplo acima, a tabela MusicPlaylist,
- Songid e Year são a chave de partição, e
- SongName é a coluna de agrupamento.
- Os dados serão agrupados com base no SongName. Nesta tabela, a cada ano, uma nova partição será criada. Todas as músicas do ano estarão no mesmo nó. Esta chave primária será muito útil para os dados.
Nossa recuperação de dados será rápida por este modelo de dados.
Modele seus dados no Cassandra
Os itens a seguir devem ser mantidos em mente ao modelar suas consultas.
- Determine quais consultas você deseja oferecer suporte
- Junta-se
- Grupo por
- Filtrando em qual coluna etc.
- Crie uma tabela de acordo com suas consultas
Crie uma tabela de acordo com suas consultas. Crie uma tabela que irá satisfazer suas dúvidas. Tente criar uma tabela de forma que um número mínimo de partições precise ser lido.
Em primeiro lugar, determine quais consultas você deseja.
Por exemplo, você precisa?
Lidando com relacionamento um para um
A relação um para um significa que duas tabelas têm correspondência um para um. Por exemplo, o aluno pode registrar apenas um curso, e eu quero pesquisar aquele aluno em qual curso um determinado aluno está registrado.
Portanto, neste caso, seu esquema de tabela deve abranger todos os detalhes do aluno em correspondência com aquele curso específico, como o nome do curso, número de rolagem do aluno, nome do aluno, etc.
Create table Student_Course(Student rollno int primary key,Student_name text,Course_name text,);
Lidando com um para muitos relacionamentos
Relacionamentos de um para muitos significa ter correspondência de um para muitos entre duas tabelas.
Por exemplo, um curso pode ser estudado por muitos alunos. Quero pesquisar todos os alunos que estão cursando um determinado curso.
Portanto, ao consultar o nome do curso, terei muitos nomes de alunos que estarão estudando um determinado curso.
Create table Student_Course(Student_rollno int,Student_name text,Course_name text,);
Posso recuperar todos os alunos de um determinado curso com a seguinte consulta.
Select * from Student_Course where Course_name='Course Name';
Tratamento de relacionamento de muitos para muitos
Relacionamentos muitos para muitos significam ter correspondência muitos para muitos entre duas tabelas.
Por exemplo, um curso pode ser estudado por muitos alunos, e um aluno também pode estudar muitos cursos.
Quero pesquisar todos os alunos que estão cursando um determinado curso. Além disso, desejo pesquisar todo o curso que um determinado aluno está estudando.
Portanto, neste caso, terei duas tabelas, ou seja, dividirei o problema em dois casos.
Primeiro, vou criar uma tabela na qual você pode encontrar os cursos de um aluno específico.
Create table Student_Course(Student_rollno int primary key,Student_name text,Course_name text,);
Posso encontrar todos os cursos de um determinado aluno através da seguinte consulta. ->
Select * from Student_Course where student_rollno=rollno;
Em segundo lugar, vou criar uma tabela na qual você pode descobrir quantos alunos estão estudando um determinado curso.
Create table Course_Student(Course_name text primary key,Student_name text,student_rollno int);
Posso encontrar um aluno em um determinado curso com a seguinte consulta.
Select * from Course_Student where Course_name=CourseName;
Diferença entre RDBMS e Cassandra Data Modeling
RDBMS |
Cassandra |
Armazena dados em formato normalizado |
Armazena dados em formato desnormalizado |
Dbms legado; dados estruturados |
Armazenamento em fileiras largas, Dinâmico; dados estruturados e não estruturados |
Resumo
A modelagem de dados no Cassandra é diferente de outros bancos de dados RDBMS. A modelagem de dados do Cassandra tem algumas regras. Essas regras devem ser seguidas para uma boa modelagem de dados. Além dessas regras, vimos três casos diferentes de modelagem de dados e como lidar com eles.