了解Cassandra数据模型

时间:2017-01-25 06:21:13

标签: cassandra

我最近通过this文章开始学习No-SQL和Cassandra。作者通过此图说明了数据模型: enter image description here

作者还给出了下面的列族示例:

Book {

 key: 9352130677{ name: “Hadoop The Definitive Guide”, author:” Tom White”, publisher:”Oreilly”, priceInr;650, category: “hadoop”, edition:4},

 key: 8177228137{ name”” Hadoop in Action”, author: “Chuck Lam”, publisher:”manning”, priceInr;590, category: “hadoop”},

 key: 8177228137{ name:” Cassandra: The Definitive Guide”, author: “Eben Hewitt”, publisher:” Oreilly”, priceInr:600, category: “cassandra”},

 }

但是在那个教程和我经历过的所有其他教程中,最后在cassandra中创建了常规表。我无法将Cassandar模型与我正在创建的模型连接起来。

例如,我创建了一个名为Employee的列族,如下所示:

create columnfamily Employee(empid int primary key,empName text,age int);

现在我插入了一些数据,我的列族看起来像这样: enter image description here

对我而言,这看起来像是一个常规的关系表,而不像作者所解释的数据模型。如何创建Employee列族,其中每行代表具有不同属性的员工?类似的东西:

Employee{
101:{name:Emp1,age:20}
102:{name:Emp2,salary:1000}
102:{manager_name:Emp3,age:45}
}

}

3 个答案:

答案 0 :(得分:4)

  1. 您需要了解在使用cql的表示中,可能看起来像常规关系表,但Cassandra中行的内部结构完全不同。它为每个员工保存不同的属性集,并且在使用cql查询时可以看到的空值只是空/不存在单元格的表示。

  2. 您要实现的是非结构化数据模型。 Cassandra从这个模型开始,所有工作都按照您阅读过的教程中的描述进行,但有一种观点认为非结构化数据设计对于开发来说是不健康的,并且会产生比它解决的更多问题。所以,过了一段时间,Cassandra搬到了#34;结构化的"数据结构(从thrift到cql)。它并不意味着您必须存储所有键/行的所有属性,它并不意味着所有行都具有相同数量的属性,它只是意味着您必须在使用之前声明属性它们。

  3. 您可以使用Map,List,Set等数据类型,UDT(用户定义类型)或仅将数据保存为json字符串并在应用程序端进行解析来实现某种非结构化数据建模。 / p>

答案 1 :(得分:1)

你所理解的是正确的。只要相信它。内部cassandra存储的列与问题中的图像完全相同。 现在,您期望的是在创建Employee表时插入未定义的列。对于动态列,您始终可以使用地图数据类型。

例如

create table Employee(
empid int primary key,
empName text,
age int,
attributes Map<text,text>);

要添加新属性,您可以在查询下方使用。

UPDATE Employee SET attributes =  { manager_name : Emp3, age:45 } WHERE empid = 102;

更新 -

创建动态列模型的另一种方法如下

        create table Employee(
    empid int primary key,
    empName text,
    attribute text,
    attributevalue text,
    primary key (empid,empName,attribute)
    );

让我们采取一些插入 -

insert into Employee (empid,empName,attribute,attributevalue) values (102,'Emp1','age','25') ;
insert into Employee (empid,empName,attribute,attributevalue) values (102,'Emp1','manager','emp2') ;
insert into Employee (empid,empName,attribute,attributevalue) values (102,'Emp1','department','hr') ;

此数据结构将创建一个宽行,并且行为类似于动态列。您可以看到主键empid和名称对于所有三行都是通用的,只有属性和值会发生变化。

希望这会有所帮助

答案 2 :(得分:-2)

Cassandra使用一个名为compositie key的特殊主键。这是分区的表示。这也是卡桑德拉伸良好的原因之一。组合键用于确定存储行的节点。

您的控制台中的结果可能是行的结果集,但cassandra的实习组织与此不同。您是否曾尝试在没有主键的情况下查询表?您很快就会发现无法查询这种灵活性(因为分区)。

之后,您将理解为什么我们必须使用查询优先设计aprosach for cassandra。这与RDBBS完全不同。