Model: Wide Column Store (Cassandra)
História
Open Source, criado pelo facebook, Cassandra foi o primeiro banco de dados não relacional orientado à colunas.Seu modelo é baseado no big table da Google.
Introdução
Armazena dados em “column Families”, linhas que possuem muitas colunas associadas a uma chave desta linha.CQL (Cassandra Query Language) é a linguagem oficial de consultas, baseada em SQL.
- Keyspace: Agrupamento de famílias de colunas = Database
- column Family: Agrupamento de colunas = Table
- Row Key: chave que representa uma linha de coluna = Primary Key
- column: Representa um valor contendo: Name, Value e Timestamp
Terminologias
Diferenças SQL x NoSQL
São muito semelhantes na foma que se cria a estrutura, mas por baixo são muito diferentes.SQL | NoSQL | |
---|---|---|
Hierárquia Table | Hierárquia Column Family | |
|
São independentes umas das outras |
|
Column | Column | |
Cada coluna armazena value Cada linha tem o mesmo conjunto de colunas (fixo) |
Cada coluna armazena key, value e Timestamp Cada linha pode ter um conjunto de colunas diferentes (variável) |
|
Update | Update | |
|
|
Usabilidade
Ausência total de transações.Indicado quando se tem um volume muito maior de leitura do que de escrita.
Uso adequado é quando se tem a necessidae de fazer as consultas pela chave primária.
Caso seja necessário usar outras colunas, deve-se usar indices, mas haverá uma perda de performance.
- Registro de Transações compras, resultados de testes, filmes assistidos, localização mais recente do filme, etc.
- Rastreamento Praticamente de qualquer coisa, incluindo status do pedido, pacotes, etc.
exemplos
Vantagens
Desvantagens
- Twitte
- NetFlix
Cases
Exemplos de CQL (Cassandra Query Language)
Manipulação de estruturas
// criação do keyspace (database)
CREATE KEYSPACE test WITH REPLICATION = {
'class' : 'SimpleStrategy', 'replication_factor' : 1
};
// seleção do keyspace
USE test;
// criação da column family (table)
CREATE COLUMNFAMILY users (
name text PRIMARY KEY,
age int,
email text
);
// Alteração de column family para inclusão de coluna
ALTER COLUMNFAMILY users ADD hobby text;
Colunas que aparecem com "NULL" nas consultas, não existem, aparecem desta forma apenas para apresentação.Manipulação de dados
// Inserção
INSERT INTO users (name, age, email) VALUES ('John', 25, 'john@mail.com');
INSERT INTO users (name, age, email) VALUES ('Mary', 28, 'mary@mail.com');
INSERT INTO users (name, age, email) VALUES ('Mike', 31, 'mike@mail.com');
// Inserção via JSON
INSERT INTO users JSON '{ "name": "Heviane" }';
// A coluna "age" e "email" não serão criadas
// Na consulta, vai aparecer NULL
// Atualização
UPDATE users SET age = 35 WHERE name = 'Heviane';
UPDATE users SET hobby = 'programming' WHERE name = 'Heviane';
// Exclução
DELETE FROM users WHERE name = 'Heviane';
No "update" não é atualizado a linha inteira (o registro por completo), é atualizado especificamente a coluna em questão.consulta de dados
// consulta de todos os registros (linhas e colunas)
SELECT * FROM users;
// consulta da coluna "age" e seu "timestamp"
SELECT age, WRITETIME(age) FROM users;
// consulta com condição (filtro)
SELECT * FROM users WHERE name = 'John';
// consulta que retorna JSON
SELECT JSON * FROM users;
Não é possível realizar uma consulta via JSON, mas pode-se retornar os dados via JSON.A função do WRITETIME (Que retorna o timestamp da coluna) não se aplica a coleções.
Outros Exemplos
CREATE KEYSPACE IF NOT EXISTS test WITH REPLICATION = {
'class' : 'SimpleStrategy', 'replication_factor' : 1
};
CREATE TABLE IF NOT EXISTS test.users (
id int PRIMARY KEY,
name text,
age int
);
INSERT INTO test.users (id, name, age) VALUES (1, 'John', 25);
INSERT INTO test.users (id, name, age) VALUES (2, 'Mary', 28);
INSERT INTO test.users (id, name, age) VALUES (3, 'Mike', 31);
SELECT * FROM test.users;
Exemplos de Estruturas
// Column
{
name: "fullName",
value: "Heviane Bastos",
timestamp: 12875789434734
}
// Column Family
{
// row
"pramod-sadalage": {
firstName: "Pramod",
lastName: "Sadalage",
lastVisit: "2012/12/12"
}
// row
"martin-fowler": {
firstName: "Martin",
lastName: "Fowler",
location: "Boston"
}
}
Column tem a chave de “fullName”, o valor de “Martin Fowler” e o timestamp associado a esta coluna.Column Family é considerada como uma coleção de colunas que possuem relações entre si.
Quando as colunas em uma “column family” são colunas simples denominamos de família de colunas padrão (standard column family).
A diferença em bancos orientados a colunas é que nem todas as linhas possuem o mesmo número de colunas e podemos adicionar ou remover colunas destas linhas sem ter que alterar a estrutura das linhas anteriores, no código acima temos um exemplo desta situação onde ambas as linhas possuem colunas diferentes entre sim, porem mesmo assim pertencem a mesma família de colunas.
// Super Column
{
name: "book:978-1-56619-909-4",
value: {
author: "Martin Fowler",
title: "Refactoring: Improving the Design of Existing Code",
isbn: "978-1-56619-909-4",
}
}
// Super Column Family
{
// row
name: "billing:martin-fowler",
value: {
address: {
name: "address:default",
value: {
fullName: "Martin Fowler",
street: "1 Main St",
zip: "12345"
}
},
billing:{
name: "billing:default",
value: {
creditCard: "1234-5678-9012-3456",
expiration: "12/12"
}
}
}
}
Super Column é uma coluna que possui um mapa de colunas, que deve conter um nome e um valor, porem este valor contém diversas colunas como um agregado de colunas do mesmo assunto.Super Column Family são indicadas para manter dados relacionados juntos.