我最近通过this文章开始学习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列族,其中每行代表具有不同属性的员工?类似的东西:
Employee{
101:{name:Emp1,age:20}
102:{name:Emp2,salary:1000}
102:{manager_name:Emp3,age:45}
}
}
答案 0 :(得分:4)
您需要了解在使用cql的表示中,可能看起来像常规关系表,但Cassandra中行的内部结构完全不同。它为每个员工保存不同的属性集,并且在使用cql查询时可以看到的空值只是空/不存在单元格的表示。
您要实现的是非结构化数据模型。 Cassandra从这个模型开始,所有工作都按照您阅读过的教程中的描述进行,但有一种观点认为非结构化数据设计对于开发来说是不健康的,并且会产生比它解决的更多问题。所以,过了一段时间,Cassandra搬到了#34;结构化的"数据结构(从thrift到cql)。它并不意味着您必须存储所有键/行的所有属性,它并不意味着所有行都具有相同数量的属性,它只是意味着您必须在使用之前声明属性它们。
您可以使用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完全不同。