Cassandra 理解卡桑德拉数据模型

Cassandra 理解卡桑德拉数据模型,cassandra,Cassandra,我最近通过这篇文章开始学习No-SQL和Cassandra。作者通过此图解释了数据模型: 作者还提供了以下列族示例: Book { key: 9352130677{ name: “Hadoop The Definitive Guide”, author:” Tom White”, publisher:”Oreilly”, priceInr;650, category: “hadoop”, edition:4}, key: 8177228137{ name”” Hadoop in Act

我最近通过这篇文章开始学习No-SQL和Cassandra。作者通过此图解释了数据模型:

作者还提供了以下列族示例:

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);
现在我插入了一些数据,我的列族如下所示:

对我来说,这看起来像一个常规的关系表,而不像作者解释的数据模型。如何创建一个员工列族,其中每一行表示具有不同属性的员工?比如:

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

}卡桑德拉使用一种特殊的主键,称为复合键。这是分区的表示形式。这也是卡桑德拉能很好地伸缩的原因之一。复合键用于确定存储行的节点

控制台中的结果可能是行的结果集,但cassandra的intern组织与此不同。您是否尝试过查询没有主键的表?您很快就会发现,由于分区的原因,您无法查询这种灵活性


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

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

比如说

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

创建动态柱模型的另一种方法如下所示

        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和name对于所有三行都是通用的,只有属性和值会更改

希望这会有所帮助

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

  • 您试图实现的是非结构化数据模型。Cassandra是从这个模型开始的,所有这些都是按照您所阅读的教程中所描述的那样工作的,但是有一种观点认为非结构化数据设计对开发是不健康的,它带来的问题比它解决的问题还要多。因此,过了一段时间,卡桑德拉转向了“结构化”数据结构(并从thrift转向cql)。这并不意味着您必须存储所有键/行的所有属性,也不意味着所有行都具有相同数量的属性,这只是意味着您必须在使用属性之前声明属性

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


  • 您引用的站点似乎非常旧。他们在另一页中提到“使用Cassandra 1.2的首选方法是cqlsh”。此外,他们还谈到了“超级专栏”。说真的,请查找一些更新的文档。DataStax Academy是一条出路:
    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') ;