[Cassandra教程] (三)数据模型(Data Model)

2016年09月04日 32386点热度 3人点赞 4条评论

原创声明:

  1. 本文为原创文章
  2. 为了更好的阅读体验,请回源站查看文章。有任何修改、订正只会在源站体现
  3. 最后更新时间:2016年09月03日

Cassandra 毕竟是一个NoSQL 数据库。 因此虽然我们大部分人可能有MySQL等RDBMS的经验,但是当切换到NoSQL之后,多少还是有一些不适应。 本节介绍的Cassandra数据模型,对后面工作的展开非常重要

(1) Cluster 集群 / DataCenter 数据中心 / Rack 机架

这一点并没有太多特殊的地方。 Cassandra 是一个分布式的数据库,多个机器在一起组建成一个集群。同时Cassandra支持多个机架(Rack) 与多个数据中心。

多个数据中心之间的数据是完全相同的, 这样即使某一个数据中心遭遇毁灭性打击,数据也有备份不会丢失,同时还可以继续向外提供服务。

 

(2) Keyspace (键空间)

貌似这个概念很少翻译成中文,本文以及以后文章也不会使用中文翻译名称。基本上可以将Keyspace 理解成MySQL 之中的Database. 只不过Cassandra的"database" 包含了更多的内容:

  • Replication Factor : 复制因数。 表示一份数据在一个DC 之中包含几份。常用奇数~ 比如我们项目组设置的replication_factor=3
  • Replica placement strategy : 复制策略。 默认的是SimpleStrategy. 如果是单机架、单数据中心的模式,保持使用SimpleStrtegy即可。

下面是一个简单的通过CQL 语句创建一个新的keyspace的例子:

 

(3) Column Family (列簇/列族,简称CF) / Column(列)

具体翻译也不知道哪种比较权威一些。 但是都有类似的翻译。 跟Keyspace 类似, 可以理解Column Family为MySQL的Table, 将Column 理解为MySQL之中的一条记录。
所谓Column就是: A tuple with name, value and timestamp。之所以称之为Column Family, 是因为Cassandra 是一种列式数据库,因此将一组Column称为Column Family。.

比较有意思的是,Column 包含了Timestamp。 其作用主要是当有新数据覆盖的时候,不是直接将老数据从存储介质上删除,而是直接写入新的数据。 当需要查询的时候,通过key或者某种方式找到的所有Column,并去找Timestamp 最新的Column。 老数据会在一段时间之后自行删除。 (这就是Cassandra默认的一致性。 Cassandra 比较偏AP。 关于一致性会在后面的文章提到。)

上面的文字可能比较抽象,可以结合下面的图来加深理解。

(注意:一个CF可以包含多个Column, 并且每一行可以包含的Column的范围不要求完全一致。 类似一个稀疏矩阵。。。)

(4) Super Column

其实这是一种已经被新版Cassandra淘汰的数据结构了。只是现在网上还有很多介绍Cassandra Super Column的文章,如果各位看到这个概念,并且您使用的是2.X以上的版本,可以完全将其忽略。

(5) 再说CF 与 Column

虽然上面我们说可以将CF想象成RDBMS之中的Table, 这能对后期的简单使用快速上手, 但是如果想深入理解Cassandra 内部的数据模型,这种理解是不太正确的。 Cassandra的发展很快,但是基础的数据模型并没有本质改变。 从2007年诞生到现在(2016年),仍然可以使用下面的一句话概括:

首先Map结构,通过key来进行查询速度会非常快。 再加上内嵌的SortedMap, 可以进行顺序查找,速度也很快。 当然,如何快速的生成Key等就是另外一个topic了

 

 

参考:
http://www.tutorialspoint.com/cassandra/cassandra_data_model.htm
https://teddyma.gitbooks.io/learncassandra_cn/content/model/internal_data_structure.html

http://www.slideshare.net/sadeghsalehi2/nosql-database-cassandra-column-base-db

 

 

 

本文为原创文章,转载请注明出处:http://www.flyml.net

RangerWolf

保持饥渴的专注,追求最佳的品质

文章评论

  • zhanglinyhl

    “将Column 理解为MySQL之中的一条记录。”其实这个理解可能有问题,Row可以理解为一条记录,Column其实是“Cell with column name”,可以理解为MySQL中的一个字段,只不过这个字段包括了字段名和字段值,还有一个时间戳。

    2016年09月07日
    • woniu

      Column Family 是不是可以理解为 关系数据库的一行数据? Column 是 关系DB中一行数据中的每个字段 的一种变形?

      2018年01月30日
      • rangerwolf

        我理解, CF 还是理解成Table。
        因为一行还是有Row 这个概念的。

        Column 确实是一个单元格的变形。

        2018年02月02日