【问题标题】:Understanding Cassandra Data Model了解 Cassandra 数据模型
【发布时间】:2017-01-25 06:21:12
【问题描述】:

我最近通过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{
101:{name:Emp1,age:20}
102:{name:Emp2,salary:1000}
102:{manager_name:Emp3,age:45}
}

}

【问题讨论】:

  • 您引用的网站似乎非常旧。他们在其他页面之一提到“使用 Cassandra 1.2 的首选方法是 cqlsh。”另外,他们正在谈论“超级专栏”。说真的,找到一些更新的文档。 DataStax Academy 是必经之路:academy.datastax.com/courses

标签: cassandra


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

  2. 您想要实现的是非结构化数据模型。 Cassandra 从这个模型开始,一切都按照您阅读的教程中的描述工作,但有一种观点认为,非结构化数据设计不利于开发,并且产生的问题多于解决的问题。因此,过了一段时间,Cassandra 转向了“结构化”数据结构(并从 thrift 转向 cql)。这并不意味着您必须存储所有键/行的所有属性,这并不意味着所有行都具有相同数量的属性,这只是意味着您必须在使用它们之前声明属性。

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

【讨论】:

    【解决方案2】:

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

    例如

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

    希望这会有所帮助

    【讨论】:

      【解决方案3】:

      Cassandra 使用称为复合键的特殊主键。这是分区的表示。这也是 cassandra 可以很好地扩展的原因之一。复合键用于确定存储行的节点。

      您的控制台中的结果可能是一组行的结果,但 cassandra 的实习生组织与此不同。你有没有试过查询没有主键的表?你很快就会发现你不能查询那么灵活(因为分区)。

      之后您就会明白为什么我们必须对 cassandra 使用查询优先的设计方法。这与 RDBBS 完全不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-26
        • 2018-06-26
        • 2017-08-10
        • 2018-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多