Cassandra Modelo de dados com exemplo de banco de dados simples

โšก Resumo Inteligente

Cassandra As regras do modelo de dados invertem os hรกbitos do design relacional: as tabelas sรฃo construรญdas para consultas, e nรฃo para entidades. Esta pรกgina aborda as regras principais, a seleรงรฃo da chave de partiรงรฃo e os esquemas funcionais para relacionamentos um-para-um, um-para-muitos e muitos-para-muitos.

  • โœ๏ธ Escrever รฉ barato: Cassandra รฉ otimizado para taxa de transferรชncia de escrita, portanto, duplicar dados entre tabelas รฉ a maneira aceita de tornar as leituras rรกpidas.
  • ๐Ÿ“‹ Consulte primeiro: Liste as consultas que o aplicativo deve responder e, em seguida, crie uma tabela por consulta, em vez de uma tabela por entidade.
  • ๐Ÿ”‘ Chave de partiรงรฃo: O primeiro elemento da chave primรกria decide qual nรณ armazena a linha e, portanto, quรฃo uniformemente os dados sรฃo distribuรญdos.
  • ๐Ÿงฉ ClusterColunas de entrada: Os elementos de chave primรกria restantes classificam as linhas dentro de uma partiรงรฃo e permitem consultas de intervalo.
  • ๐Ÿ“ Tamanho da partiรงรฃo: Poucas partiรงรตes criam pontos de acesso frequentes e linhas muito grandes; muitas partiรงรตes forรงam uma leitura a visitar muitos nรณs.
  • ๐Ÿ”— Relacionamentos: Relacionamentos um-para-um exigem uma รบnica tabela, relacionamentos um-para-muitos exigem uma chave composta e relacionamentos muitos-para-muitos exigem uma tabela para cada direรงรฃo da consulta.

Cassandra Exemplo de modelo de dados

Apesar Cassandra A linguagem de consulta se assemelha a SQL linguagem, seus mรฉtodos de modelagem de dados sรฃo totalmente diferentes.

In Cassandra, um modelo de dados ruim pode degradar o desempenho, especialmente quando os usuรกrios tentam implementar os conceitos do RDBMS em Cassandra. ร‰ melhor ter em mente algumas regras detalhadas abaixo.

Cassandra Regras do modelo de dados

In Cassandra, as gravaรงรตes nรฃo sรฃo caras. Cassandra nรฃo suporta junรงรตes, agrupamento por, clรกusula OR, agregaรงรตes, etc. Portanto, vocรช deve armazenar seus dados de forma que sejam totalmente recuperรกveis. Portanto, essas regras devem ser mantidas em mente ao modelar dados em Cassandra.

Maximize o nรบmero de gravaรงรตes

In Cassandra, as gravaรงรตes sรฃo muito baratas. Cassandra O sistema รฉ otimizado para alto desempenho de gravaรงรฃo. Portanto, tente maximizar suas gravaรงรตes para obter melhor desempenho de leitura e disponibilidade de dados. Existe uma relaรงรฃo de compromisso entre gravaรงรฃo e leitura de dados. Assim, otimize o desempenho de leitura de dados maximizando o nรบmero de gravaรงรตes.

Maximize a duplicaรงรฃo de dados

A desnormalizaรงรฃo e a duplicaรงรฃo de dados sรฃo de fato Cassandra. O espaรงo em disco nรฃo รฉ mais caro que a memรณria, o processamento da CPU e a operaรงรฃo de IOs. Como Cassandra รฉ um banco de dados distribuรญdo, portanto, a duplicaรงรฃo de dados fornece disponibilidade instantรขnea de dados e nenhum ponto รบnico de falha.

Cassandra Metas de modelagem de dados

Vocรช deve ter os seguintes objetivos ao modelar dados em Cassandra:

Distribua os dados uniformemente pelo Cluster

Vocรช deseja uma quantidade igual de dados em cada nรณ do Cassandra ClusterOs dados sรฃo distribuรญdos entre os diferentes nรณs com base nas chaves de partiรงรฃo, que sรฃo a primeira parte da chave primรกria. Portanto, tente escolher uma coluna de alta cardinalidade como chave de partiรงรฃo para distribuir 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 diferentes nรณs de diferentes partiรงรตes.

Se houver muitas partiรงรตes, todas essas partiรงรตes deverรฃo ser visitadas para coletar os dados da consulta.

Isso nรฃo significa que nรฃo se deva criar partiรงรตes. Se seus dados forem muito grandes, vocรช nรฃo poderรก armazenar essa enorme quantidade de dados em uma รบnica partiรงรฃo. Uma รบnica partiรงรฃo ficarรก mais lenta.

Portanto, tente escolher um nรบmero equilibrado de partiรงรตes.

Boa chave primรกria Cassandra

Os dois objetivos acima se resumem a uma รบnica decisรฃo, portanto, os dois esquemas abaixo mostram a mesma tabela com uma chave inadequada e, em seguida, com uma chave adequada.

Vamos pegar 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, tabela MusicPlaylist,

  • SongId รฉ a chave de partiรงรฃo, e
  • SongName รฉ a coluna de cluster
  • Os dados serรฃo agrupados com base no nome da mรบsica (SongName). Apenas uma partiรงรฃo serรก criada para cada ID da mรบsica (SongId) e, como cada mรบsica possui um identificador distinto, cada partiรงรฃo conterรก uma รบnica linha.

A recuperaรงรฃo de dados serรก lenta por este modelo de dados devido ร  chave primรกria incorreta.

Aqui estรก outra tabela MusicPlaylist.

CREATE TABLE MusicPlaylist (
    SongId int,
    SongName text,
    Year int,
    Singer text,
    PRIMARY KEY ((SongId, Year), SongName)
);

No exemplo acima, tabela MusicPlaylist,

  • SongId e Year sรฃo a chave de partiรงรฃo, e
  • SongName รฉ a coluna de cluster.
  • Os dados serรฃo agrupados com base no SongName. Nesta tabela, a cada ano, serรก criada uma nova partiรงรฃo. 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 em Cassandra

Os seguintes itens devem ser mantidos em mente ao modelar suas consultas:

Determine quais consultas vocรช deseja oferecer suporte

Em primeiro lugar, determine quais consultas vocรช deseja.

Por exemplo, vocรช precisa?

  • Junta
  • Agrupar por
  • Filtrando em qual coluna etc.

Crie tabela de acordo com suas consultas

Crie tabela de acordo com suas dรบvidas. Crie uma tabela que satisfaรงa suas dรบvidas. Tente criar uma tabela de forma que seja necessรกrio ler um nรบmero mรญnimo de partiรงรตes.

As trรชs seรงรตes que se seguem aplicam esse princรญpio aos trรชs tipos de relacionamento encontrados em quase todos os esquemas.

Lidando com relacionamento um para um em Cassandra

Relacionamento um para um significa que duas tabelas tรชm correspondรชncia um para um. Por exemplo, o aluno pode matricular apenas um curso, e quero pesquisar em um aluno em qual curso um determinado aluno estรก matriculado.

Portanto, neste caso, o esquema da sua tabela deve abranger todos os detalhes do aluno correspondentes a esse curso especรญfico, como o nome do curso, o nรบmero do aluno, o nome do aluno, etc.

Relacionamento um para um em Cassandra
Relacionamento um para um em Cassandra

O diagrama acima mostra uma รบnica tabela atendendo ร  consulta, porque cada aluno corresponde a exatamente um curso.

CREATE TABLE Student_Course (
    Student_rollno int PRIMARY KEY,
    Student_name text,
    Course_name text
);

Como Student_rollno รฉ a chave de partiรงรฃo, uma pesquisa pelo nรบmero de matrรญcula retorna exatamente uma partiรงรฃo.

Lidando com relacionamentos um para muitos em Cassandra

Relacionamentos um para muitos significa ter correspondรชncia 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 estudarรฃo um determinado curso.

Relacionamento um para muitos em Cassandra
Relacionamento um para muitos em Cassandra

Nesse caso, o nome do curso se torna a chave de partiรงรฃo, de forma que todos os alunos de um curso sejam alocados na mesma partiรงรฃo, e o nรบmero de matrรญcula se torna a coluna de agrupamento, garantindo que cada aluno permaneรงa em uma linha distinta.

CREATE TABLE Student_Course (
    Course_name text,
    Student_rollno int,
    Student_name text,
    PRIMARY KEY (Course_name, Student_rollno)
);

Posso recuperar todos os alunos de um determinado curso por meio da seguinte consulta.

SELECT * FROM Student_Course WHERE Course_name = 'Course Name';

Lidando com relacionamentos muitos para muitos Cassandra

Relacionamentos muitos para muitos significa ter muitas correspondรชncias entre duas tabelas.

Por exemplo, um curso pode ser cursado por muitos alunos e um aluno tambรฉm pode cursar muitos cursos.

Relacionamento Muitos para Muitos em Cassandra
Relacionamento Muitos para Muitos em Cassandra

Quero pesquisar todos os alunos que estรฃo cursando um determinado curso. Alรฉm disso, quero pesquisar todo o curso que um determinado aluno estรก cursando.

Neste caso, terei duas tabelas, ou seja, dividirei o problema em dois casos. Esta รฉ a ilustraรงรฃo mais clara da regra de duplicaรงรฃo: os mesmos dados sรฃo escritos duas vezes para que cada consulta leia uma partiรงรฃo.

Primeiro, criarei uma tabela na qual vocรช poderรก encontrar os cursos de um determinado aluno.

CREATE TABLE Student_Course (
    Student_rollno int,
    Course_name text,
    Student_name text,
    PRIMARY KEY (Student_rollno, Course_name)
);

Posso encontrar todos os cursos de um determinado aluno atravรฉs da seguinte consulta.

SELECT * FROM Student_Course WHERE Student_rollno = 101;

Em segundo lugar, criarei uma tabela na qual vocรช poderรก saber quantos alunos estรฃo cursando um determinado curso.

CREATE TABLE Course_Student (
    Course_name text,
    Student_rollno int,
    Student_name text,
    PRIMARY KEY (Course_name, Student_rollno)
);

Posso encontrar um aluno em um determinado curso atravรฉs da seguinte consulta.

SELECT * FROM Course_Student WHERE Course_name = 'Cassandra';

Ambas as tabelas devem ser atualizadas sempre que um aluno se inscreve em um curso, normalmente dentro de um รบnico lote de login, para que as duas cรณpias permaneรงam sincronizadas.

comum Cassandra Erros na modelagem de dados

A maioria dos esquemas ruins repete os mesmos poucos erros, e cada um tracretomamos um hรกbito herdado do design relacional.

  • Partiรงรตes ilimitadas: Escolher uma chave de partiรงรฃo como o nome de um paรญs coloca milhรตes de linhas em uma รบnica partiรงรฃo. Adicione um intervalo de tempo, por exemplo (paรญs, mรชs), para manter as partiรงรตes em um tamanho razoรกvel.
  • Chaves de cardinalidade muito baixa: Uma chave de partiรงรฃo com apenas alguns valores possรญveis, como um indicador de status, concentra todo o trรกfego em alguns nรณs e deixa o restante ocioso.
  • Utilizando ALLOW FILTERING para que uma consulta funcione: Ele examina todas as partiรงรตes e oculta um problema de modelagem. Se uma consulta precisar disso, o esquema precisarรก de outra tabela.
  • Modelagem de entidades em vez de consultas: Criar uma tabela de alunos e uma tabela de cursos, e depois tentar uni-las no aplicativo, anula o propรณsito do projeto.
  • Exclusรตes e sobrescritas frequentes: Cada exclusรฃo cria um marcador de exclusรฃo que precisa ser lido e ignorado atรฉ que a compactaรงรฃo o remova, o que torna as leituras mais lentas em partiรงรตes frequentemente acessadas.

Evitar esses erros mantรฉm o esquema alinhado com as regras estabelecidas no inรญcio desta pรกgina e com os contrastes relacionais resumidos abaixo.

Diferenรงa entre RDBMS e Cassandra Modelagem de Dados

RDBMS Cassandra
Armazena dados em formato normalizado Armazena dados em formato desnormalizado
Bancos de dados legados; dados estruturados Armazenamento em linhas largas, dinรขmico; dados estruturados e nรฃo estruturados
O esquema รฉ projetado em torno de entidades e seus relacionamentos. O esquema รฉ projetado em torno das consultas que o aplicativo executarรก.
Junรงรตes, GROUP BY e clรกusulas WHERE arbitrรกrias sรฃo suportadas. Nรฃo sรฃo permitidas junรงรตes ou filtragens arbitrรกrias; as consultas devem corresponder ร  chave primรกria.
Uma tabela geralmente atende a vรกrias consultas diferentes. Normalmente, uma tabela atende a uma รบnica consulta, portanto, os dados sรฃo duplicados entre as tabelas.
Integridade referencial garantida por chaves estrangeiras Nรฃo hรก chaves estrangeiras; a consistรชncia entre tabelas duplicadas รฉ de responsabilidade da aplicaรงรฃo.

Essas decisรตes de esquema sรฃo aplicadas na prรกtica em Cassandra mesa e espaรงo de chave tutoriais.

Perguntas Frequentes

Procure manter menos de 100 MB e aproximadamente 100,000 linhas por partiรงรฃo. Partiรงรตes maiores tornam as leituras mais lentas, aumentam o tempo de reparo e elevam a pressรฃo sobre a memรณria durante a compactaรงรฃo.

A chave de partiรงรฃo determina em qual nรณ a linha serรก armazenada. ClusterAs colunas de classificaรงรฃo definem a ordem de classificaรงรฃo das linhas dentro dessa partiรงรฃo e permitem consultas de intervalo, como um intervalo de datas.

As visรตes materializadas automatizam a duplicaรงรฃo, mas ainda sรฃo um recurso experimental com casos extremos de consistรชncia conhecidos. A maioria dos esquemas de produรงรฃo ainda mantรฉm a segunda tabela da aplicaรงรฃo.

A IA pode traduzir entidades em tabelas candidatas, mas uma Cassandra O esquema segue as consultas em vez das entidades. Forneรงa primeiro a lista de consultas e, em seguida, trate as tabelas geradas como rascunhos para validar o tamanho da partiรงรฃo.

Considerando a cardinalidade da coluna e a quantidade esperada de linhas, a IA pode sinalizar chaves com probabilidade de criar pontos de acesso frequentes ou partiรงรตes ilimitadas. Confirme o aviso com o comando `nodetool tablehistograms` apรณs o carregamento dos dados reais.

Resuma esta postagem com: