NoSQL: Bancos de dados orientados à colunas

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.

NoSQL Column Image

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
  • Database instance
  • Schema Fixo (crescimento exponencial)
  • Existem colunas vazias
  • Cluster
  • Schema variável (cresimento conforme a demanda)
  • Não existem colunas vazias
    São independentes umas das outras
  • Column Column
  • Column (same for all rows)
    Cada coluna armazena value
    Cada linha tem o mesmo conjunto de colunas (fixo)
  • Column (can be different per row)
    Cada coluna armazena key, value e Timestamp
    Cada linha pode ter um conjunto de colunas diferentes (variável)
  • Update Update
  • Atualiza o registro (row) como um todo
  • Atualiza somente a coluna especificada
  • 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.

    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.

    References