Coluna-conceito de família e modelo de dados

Estou a investigar os diferentes tipos de bases de dados NoSQL e estou a tentar perceber o modelo de dados de lojas familiares de colunas, como o Bigtable, o HBase e a Cassandra.

primeiro modelo

Algumas pessoas descrevem uma coluna de família como um conjunto de linhas, onde cada linha contém colunas [1], [2]. Um exemplo deste modelo (as famílias das colunas são maiúsculas):

{
  "USER":
  {
    "codinghorror": { "name": "Jeff", "blog": "http://codinghorror.com/" },
    "jonskeet": { "name": "Jon Skeet", "email": "[email protected]" }
  },
  "BOOKMARK":
  {
    "codinghorror":
    {
      "http://codinghorror.com/": "My awesome blog",
      "http://unicorns.com/": "Weaponized ponies"
    },
    "jonskeet":
    {
      "http://msmvps.com/blogs/jon_skeet/": "Coding Blog",
      "http://manning.com/skeet2/": "C# in Depth, Second Edition"
    }
  }
}

segundo modelo

outros locais descrever uma coluna de família como um grupo de colunas relacionadas dentro de uma linha [3], [4]. Dados do exemplo anterior, modelados desta forma:

{
  "codinghorror":
  {
    "USER": { "name": "Jeff", "blog": "http://codinghorror.com/" },
    "BOOKMARK":
    {
      "http://codinghorror.com/": "My awesome blog",
      "http://unicorns.com/": "Weaponized ponies"
    }
  },
  "jonskeet":
  {
    "USER": { "name": "Jon Skeet", "email": "[email protected]" },
    "BOOKMARK":
    {
      "http://msmvps.com/blogs/jon_skeet/": "Coding Blog",
      "http://manning.com/skeet2/": "C# in Depth, Second Edition"
    }
  }
}

uma possível lógica por trás do primeiro modelo é que nem todas as famílias das colunas têm uma relação como USER e BOOKMARK têm. Isto implica que nem todas as famílias de colunas contêm chaves idênticas. Colocar as famílias da coluna no nível exterior parece mais natural a partir deste ponto de visualizar.

o nome "família de colunas" implica um grupo de colunas. É exatamente assim que as famílias das colunas são apresentadas no segundo modelo.

ambos os modelos são representações válidas dos dados. Eu percebo que essas representações são apenas para comunicar os dados para os seres humanos; as aplicações não "pensam" de dados de tal forma.

Pergunta

Qual é a definição "padrão" de uma família de colunas? É uma coleção de linhas, ou um grupo de colunas relacionadas dentro de uma fila?

Tenho de escrever um artigo sobre o assunto, por isso também estou interessado em como as pessoas costumam explicar o conceito de "família coluna" a outras pessoas. Ambos os modelos parecem contradizer-se. Eu gostaria de usar o' correto ' ou modelo geralmente aceito para descrever column-family stores.


actualizar

Resolvi o segundo modelo para explicar o modelo de dados no meu jornal. Eu ainda estou interessado em como Você explicar o modelo de dados de column-family stores para outras pessoas.

Author: Niels van der Rest, 2010-07-14

3 answers

A base de dados Cassandra segue o teu primeiro modelo, acho eu. ColumnFamily é uma coleção de linhas, que podem conter quaisquer colunas, de forma esparsa (assim cada linha pode ter uma coleção diferente de nomes de colunas, se desejado). O número de colunas permitidas em seguida é quase ilimitado (2 bilhões em Cassandra v0.7).

Um ponto chave é que as chaves das linhas devem ser únicas dentro de uma família de colunas, por definição - mas podem ser reutilizadas em outras famílias de colunas. Então você pode armazenar dados não relacionados mais ou menos a mesma chave em Colunfamílias diferentes.

Em Cassandra isso importa porque os dados em uma determinada família de colunas são armazenados nos mesmos arquivos no disco-assim que é mais eficiente colocar os itens de dados que são susceptíveis de ser recuperados junto, na mesma Columnfamília. Trata-se, em parte, de uma questão de rapidez prática, mas também de organizar os seus dados num esquema claro. Isto toca em sua segunda definição-pode-se considerar todos os dados sobre uma chave particular para ser um "row", mas dividido pela coluna da família. No entanto, em Cassandra não é realmente uma única linha, porque os dados em uma Columnfamília pode ser alterado independentemente dos dados em outras Columnfamílias para a mesma chave de linha.

 8
Author: DNA, 2014-02-14 09:25:04
Os dois modelos que descreveste são os mesmos.

A família das colunas é:

Key -> Key -> (Set of key/value pairs)

Conceptualmente torna-se:

Table -> Row -> (Column1/Value1, Column2/Value2, ...)

Pense nisso como um mapa de pares chave/valor.

UserProfile = {
    Cassandra = [emailAddress:"[email protected]", age:20],
    TerryCho = [emailAddress:"[email protected]", gender:"male"],
    Cath = [emailAddress:"[email protected]", age:20, gender:"female", address:"Seoul"],
}

O acima é um exemplo de uma família de colunas. Se fosse tabular, receberia uma tabela chamada UserProfile, que se parece com: [[7]}

UserName | Email | Age | Gender | Address
Cassandra | [email protected] | 20 | null | null
TerryCho | [email protected] | null | male | null
Cath | [email protected] | 20 | female | Seoul
A parte confusa é que não há realmente uma coluna ou uma linha como estamos acostumados a pensar neles. Há um monte de "famílias de coluna" que são questionados pelo nome (a chave). Essas famílias contêm um monte de conjuntos de pares chave/valor, que também são questionados pelo nome (a chave linha), e, finalmente, cada valor no conjunto pode ser pesquisado pelo nome também (a chave coluna).

Se precisasse de um ponto de referência tabular, as "famílias da coluna" seriam as suas "tabelas". Cada" conjunto de pares k/v "dentro deles seria as suas "linhas". Cada " par do conjunto "seria os"nomes das colunas e seus valores".

Internamente, os dados dentro de cada coluna são familiares. vai ser armazenado em conjunto, e vai ser armazenado de tal forma que as linhas são uma após a outra, e em cada linha, as colunas são uma após a outra. Então você tem row1 -> col1/val1, col2/val2, ... , row2 -> col1/val1 ... , ... -> .... Então, nesse sentido, os dados são armazenados muito mais como um row-store, e menos como um column-store. Para terminar, a escolha de palavras aqui é apenas infeliz e enganadora. As colunas nas famílias de colunas deveriam ter sido chamadas de atributos. As linhas deveriam ter sido chamadas de Conjuntos de atributos. As famílias das colunas deviam ter sido chamadas Atributos famílias. A relação com o vocabulário tabular clássico é fraca e enganadora, já que é bastante diferente.
 5
Author: Didier A., 2017-01-21 07:33:09
Pelo que sei, Cassandra ColumnFamily não é uma coleção de linhas, mas sim um conjunto de colunas. A coluna é agrupada com base na chave de agrupamento. por exemplo, vamos considerar abaixo da família column:
CREATE TABLE store (
  enrollmentId int,
  roleId int,
  name text,
  age int,
  occupation text,
  resume blob,
  PRIMARY KEY ((enrollmentId, roleId), name)
) ;


INSERT INTO store (enrollmentid, roleid, name, age, occupation, resume)
values (10293483, 01, 'John Smith', 26, 'Teacher', 0x7b22494d4549);

Obtido por cima dos detalhes usando cassandra-cli, é bastante bem agrupado com base na chave de agrupamento, neste exemplo "name = John Smith" é a chave de agrupamento.

RowKey: 10293483:1
=> (name=John Smith:, value=, timestamp=1415104618399000)
=> (name=John Smith:age, value=0000001a, timestamp=1415104618399000)
=> (name=John Smith:occupation, value=54656163686572, timestamp=1415104618399000)
=> (name=John Smith:resume, value=7b22494d4549, timestamp=1415104618399000)
 2
Author: dwingle, 2014-11-04 12:44:03