文中主要交代Cassandra的编程模型及数据结构。

由于Cassandra版本数次更新,网上中文的资料已经有点过时,比较有代表性的比如ebuy那篇文章都已经过时了,于是自己找资料,结合官方博客写一篇Cassandra模型的文章。

一些名词的介绍:由于技术名词冲突,BigTable里的表对应的是Cassandra里的列族,而BigTable里面列族的概念更类似Cassandra早期实现里的超级列(该功能在Cassandra里已被关闭)。

Cassandra介绍

首先介绍一下Cassandra。

Cassandra是Apache的开源项目,是NoSQL的一种,广泛意义上的列族数据库,分布式,无中心机。其早期实现主要参考了Google的Big Table论文及亚马逊的Dynamo论文中的介绍,可以参考两篇论文来获得Cassandra的设计思想,关于更详细的资料,可以参见wiki及官方文档。

早期实现及最佳实践

前文提到早期实现,那么现在当然与早期区别已经极大了,从数据模型设计到实际使用,基本上已经自成体系了。其中之一最大的改变,就是1.1版本里对数据库操作的改变。

Cassandra的早期实现里,使用的完全是BigTable的数据模型,即列及列族及主键等概念。在ebuy的最佳实践的文中,对该模型的使用做了详细解释,我无意在此引用他人文章,只是简单说一下概念。

最佳实践文章总共分两部分,上部分主要说的是列族数据库中该如何设计数据模型,其中主要讨论的是对关系及部分相关数据的重复储存来减少对数据库的分布式读取,其中对列族数据库数据结构的有个挺有意思的式子,如下:

Map<RowKey, SortedMap<ColumnKey, ColumnValue>>

下部分交代的则是Cassandra中的具体实现方式,比如当时Cassandra实现了一个与BigTable列族类似的东西,或者说只是名字不同的东西,就是超级列,把类似的列聚
合在一起提取。

再比如说推荐使用胖列(使用列键查询)而不是瘦列(使用主键查询)。胖列指的是以大量的列储存关系,比如用户表users有三列user_k,p1,p2,第一列user_k是主键,第二列p1是用户购买的产品1,第三列p2是用户购买的产品2,pn可以扩展到极大的数量.

注:上文只是简单解释,实际全文中对各种应用场景的讨论不仅限于该范围。

磁盘储存方式

Cassandra使用的方式是:把一级主键当做分区主键,列名作为列键储存。光说不清楚,上图:(图片来自Cassandra 1.1)

CREATE TABLE timeline (
user_id varchar,
tweet_id uuid,
author varchar,
body varchar,
PRIMARY KEY (user_id, tweet_id)
);

上图是传统数据库的储存方式。

上图是Cassandra的储存方式,注意{1787,author}是列键名而不只是数据。

现在的实现

随着Cassandra的成长,原先完全按照BigTable实现的数据模型开始产生一些问题,其中之一就是无法无限扩大的列的数量,虽然已经设计了一个足够大的列数量,但对于大数据分布式数据库,仍然是不够用的,而且超级列的方式灵活性受限制,于是开发者开始走自己的道路,于是随着CQL(Cassandra自己的类似SQL的操作语言)的发布及发展,首先清除了超级列(BigTable里的列族)的概念:在CQL中,没有超级列的概念,在列上一级就是表,也就是原先概念上的超级列是不存在的,那针对原先的胖列的应用场景,该如何处理呢?

CQL中有主键及二级主键的概念,主键就是原先的主键,这个概念没有变化,而对于原先的超级列聚合,CQL通过把二级主键的值加上列名作为列键名解决了这个问题。

也就是说,把原先由数据字典(请允许我使用这个关系数据库词汇)储存的数据储存到了数据表中,减轻了对数据字典的访问及数据字典数据结构的维持开销,把压力下发到数据表。

参考:

Schema in Cassandra 1.1

Cassandra Wiki

Cassandra Data Modeling Best Practices, Part 1

Cassandra Data Modeling Best Practices, Part 2

Cassandra 数据模型 (基于CQL,解决胖列数量限制及灵活性问题)(1.1及以上版本)的更多相关文章

  1. Cassandra数据模型和模式(Schema)的配置检查

    免责声明 本文档提供了有关DataStax Enterprise(DSE)和Apache Cassandra的常规数据建模和架构配置建议.本文档需要DSE / Cassandra基本知识.它不能代替官 ...

  2. Cassandra数据模型

    Ⅰ.数据模型 1.1 Column 一组包含Name/Value Pair的数据叫Row,其中每一组Name/Value Pair叫Column Column是Cassandra最基本的数据结构,它是 ...

  3. python – 基于pandas中的列中的值从DataFrame中选择行

    如何从基于pandas中某些列的值的DataFrame中选择行?在SQL中我将使用: select * from table where colume_name = some_value. 我试图看看 ...

  4. Insert插入不同的列数量,统计信息对比

    一.实验目的: Insert插入表中相同的行数量,不同的列数量,通过10046 和autotrace工具对比查看逻辑读.物理读.time数据,并得出相应结论 二.测试 2.1测试流程: =>[为 ...

  5. Hash(散列函数)简单应用引出解决散列冲突的四种方法

    商店允许顾客通过电话订购商品,并在几天后上门自取.商店的数据库使用客户的电话号码作为其检索的关键字(客户知道自己的电话号码,而且这些电话关键字几乎是唯一的).如何组织商店的数据库,以允许更加高效的进行 ...

  6. 基于PROMISE解决回调地狱问题

    回调地狱问题: 在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱.比如说你要把一个函数 A 作为回调函数, ...

  7. flex布局 justify-content:space-between; 解决最后一排数量不够自动向两端排列问题和flex布局的元素会有默认间隙(垂直间隙)

    1 .flex 布局两端对齐当最后一排数量不够时,会出现以下布局情况 实现效果: 解决方案:使用after伪类, 解决最后一排数量不够两端分布的情况.宽度就是每张图片的宽度 .list:after { ...

  8. 解决create-react-app 后 npm start or yarn start 中出现 的webpack版本问题

    解决create-react-app 后 npm start or yarn start 中出现 的webpack版本问题 错误提示信息 There might be a problem with t ...

  9. Cassandra 数据模型

    Cassandra的数据模型类似于关系型数据库的模型,且提供了与SQL语言非常类似的CQL语言进行操作. 但是Cassandra的数据模型类似于多层键值对结构,与关系型数据库存在巨大差别. 本文基于: ...

随机推荐

  1. eclipse对项目整理分类

    1.Eclipse提供了工作集(Working Set)的功能,它可以用来划分这些项目. 在Package Explorer视图的下拉菜单里选择Show->Working Sets,然后还是在它 ...

  2. Mac 下用 go 开发Android应用环境设置

    需要的工具 设置代理 请参考:http://www.cnblogs.com/ghj1976/p/5087049.html Mac 下命令行设置代理: export http_proxy=http:// ...

  3. rhel5 新建用户提示:the home directory already exists.

    rhel5 新建用户提示:the home directory already exists.(as4不存在这个问题) 环境如下: [oracle@rhel5 ~]$ df -hFilesystem  ...

  4. Java的四种引用

    1.强引用(StrongReference)强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程 ...

  5. 在RAC中,当私有网线拔了后,会怎么样?

    原文链接http://blog.mchz.com.cn/?p=4305 实际环境: OS:oel5.5_x64 ORACLE:10205 3节点rac 架设于vmware esxi虚拟机上 所需测试项 ...

  6. MySQL游标学习总结

    游标的概念 在数据库中,游标是一个十分重要的概念.游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制.游标总是与一条 ...

  7. IIS错误代码表

    当用户试图通过 HTTP 或文件传输协议 (FTP) 访问一台正在运行 Internet 信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字代码.该状态代码记录在 IIS ...

  8. SparkSQL External Datasource简易使用之AVRO

    下载源码&编译: git clone https://github.com/databricks/spark-avro.git sbt/sbt package Maven GAV: group ...

  9. UVA 10245 - The Closest Pair Problem

    Problem JThe Closest Pair ProblemInput: standard inputOutput: standard outputTime Limit: 8 secondsMe ...

  10. 翻译:Knockout 快速上手 - 5: 你需要知道的顶级特性 续

    Utilities Knockout 提供了许多可以你开发中使用的工具,你可以在 ko.utils 命名空间中找到它们,我最喜欢的工具如下所示: extend: 这个方法将两个对象合并在一起,调用这个 ...