Coluna-conceito de família e modelo de dados
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.3 answers
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.
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ê temrow1 -> 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.
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)