转自:http://www.infoq.com/cn/articles/best-practice-of-cassandra-data-model-design

不要把Cassandra model想象成关系型数据库table

取而代之,应该把它想象成事一个有序的map结构。

对于一个新手来说,下面关系型数据库术语常常被对应到Cassandra模型

这种对比可以帮助我们从关系型数据库转换到非关系型数据库。但是当设计Cassandra column famiy的时候请不要这样去类比。取而代之,考虑它是一个map中嵌入另一个map:外部map的key为row key,内部map的key为column key,两个map的key都是有序的。如下:

SortedMap<RowKey, SortedMap<ColumnKey, ColumnValue>>

why?

将column family想象成嵌套的并排序的map比关系型数据库table描述的更为准确,它将帮助你正确的进行Cassandra模型设计。

How?

  • Map可以进行高效查询,同时排序的特性可以进行高效column扫描。在Cassandra中,我们可以使用row key和column key做高效查找和范围扫描
  • Column key的数量是很庞大的(译者注:目前译者所使用的Cassandra1.2.5版本,每个row支持最多20亿个columns)。换句话说你,你可以拥有一个wide rows。
  • Column key自身可以存储值,即你可以拥有一个没有值的column。

如果集群使用Order Preserving Partitioner (OOP)策略进行数据存储,就可以对row key进行范围查询。但是OOP大多数情况都不推荐使用(译者注:将rowkey按照顺序存储到节点上,如果分区不均匀,将导致数据读写不均衡),所以你可以认为外部的map是不排序的,如下:

Map<RowKey, SortedMap<ColumnKey, ColumnValue>>

上面提到的”Super Column”,认为它们是一组column,这样的话,两级嵌套map就会像下面展示的一样变为三级嵌套map:

Map<RowKey, SortedMap<SuperColumnKey,
           SortedMap<ColumnKey, ColumnValue>>>

注意:

  • 你需要传递timestamp给每个column value,因为Cassandra使用它做内部的冲突处理机制。但在建模过程中你可以忽略它(译者注:在操作column的时候timestamp信息 会自动添加到column)。同时,不要考虑在你的程序中使用column的timestamp,因为它不是为你设计的,与Hbase不同,它们不会生成 新的version数据(译者注:在Hbase中相同rowkey和column key的数据会保存多个version,而Cassandra会将相同数据覆盖,timestamp只保存最后一次更新的时间)。
  • 因为Super Column的性能问题和缺乏二级索引支持问题,Cassandra社区对它的使用曾有过强烈争议。所以,推荐使用Composite Columns代替Super Column实现功能。(译者注:使用Super Column,如果你要获取其中一个columnvalue,则要扫描整个Super Column,这会导致查询性能很糟糕)

围绕着查询模式进行Column Family建模

建模尽量从实体和它们的关系开始

  • 与关系型数据库不同,在Cassandra中通过创建二级索引或者编写复杂SQL(使用joins, order by, group by)来新建或修改查询不是件容易的事情。因为Cassandra具有很高的分布式特性,所以要先考虑查询模式,然后再设计column family。
  • 牢记前面提到的嵌入排序map数据结构,在考虑如何组织你的数据到map,以满足快速查询/排序/分组/过滤/聚合的要求。

在大部分情况下,实体和它们的关系是很重要的(特殊用例除外,如日志存储或者其它时间序列数据)。如果我给你一个查询模式,用于为一个电子商务网站 创建Cassandra模型,但不告诉你任何实体和它们的关系。你会有意或者无意的从查询模式或者从你之前领域对象的理解找出实体和它们之间的关系(因为 我们是通过实体和关系来描述真实世界)。在设计数据模型时最好从实体和关系开始,然后使用反范式化和冗余的方式继续围绕查询模式建模。如果这听起来有些让 人困惑,通过后面的详细例子就可以理解。

注意:在建模的时候考虑以下几点会很有帮助。区分频次大的查询和频次小的查询,有些查询可能只被查询几千次,其它可能被查询数十亿次;还要考虑哪些查询对数据延迟是敏感的。确保你的模型优先满足查询频次大的查询和重要查询。

转载于:https://www.cnblogs.com/bonelee/p/6279079.html

Cassandra 数据模型设计,根据你的查询来制定设计——反范式设计本质:空间换时间...相关推荐

  1. Cassandra数据模型设计最佳实践

    2019独角兽企业重金招聘Python工程师标准>>> 本文是Cassandra数据模型设计第一篇(全两篇),该系列文章包含了eBay使用Cassandra数据模型设计的一些实践.其 ...

  2. 前端遍历导致查询数据时间过长_OLAP 服务器,空间换时间可行吗?

    [摘要] 全量预汇总真的是提高 OLAP 性能的可行方案吗?点击了解OLAP 服务器,空间换时间可行吗? 多维分析提供拖拽.旋转.切片.钻取等等人机交互操作,必须有秒级的响应速度.而这些操作对应的明细 ...

  3. Merkle 树——空间换时间,分而治之的hash表,通过根节点是由它的两个子节点内容的哈希值组成来校验数据完整性,定位篡改的数据位置...

    Merkle 树 图 1.5.6.1 - Merkle 树示例 默克尔树(又叫哈希树)是一种二叉树,由一个根节点.一组中间节点和一组叶节点组成.最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的 ...

  4. 图解Skip List——本质是空间换时间的数据结构,在lucene的倒排列表,bigtable,hbase,cassandra的memtable,redis中sorted set中均用到...

    Skip List的提出已有二十多年[Pugh, W. (1990)],却依旧应用广泛(Redis.LevelDB等).作为平衡树(AVL.红黑树.伸展树.树堆)的替代方案,虽然它性能不如平衡树稳定, ...

  5. 关于数据模型设计和落地的一篇罕见干货

    关于数据模型设计和落地的一篇罕见干货 大数据技术的奥秘--数据模型 大数据时代,各大企业和政府机构都在热火朝天的进行着数据方面的建设,数据开始在组织中成为一种文化.反映在日常就是无论担任何种角色,几乎 ...

  6. 【mysql的设计与优化专题(2)】数据中设计中的范式与反范式

    设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小.但是有些时候一昧的追求范式减少冗余,反而会降低数据读写 ...

  7. 大数据互联网架构阶段 数据库三范式与反范式

    数据库范式 一. 三范式 主键: 创建表时可以不设置主键 , 但是没有设置主键的表 , 底层会认为所有的键都是主键 ,所以在创建时使用了所有的字段创建索引 , 在查询时索引的存在几乎没有意义 . 复合 ...

  8. Phase2 Day19 数据库范式设计 复杂查询

    文章目录 数据库范式设计 范式级别 数据表中的键 从1NF到3NF BCNF 总结 复杂查询 1. 链接查询 1.1 交叉连接 1.2 等值连接 1.2.1 自然连接 1.2.2 USING连接 1. ...

  9. 浅析SAAS数据模型设计(Oracle)

    目前SAAS平台对于大家来说并不陌生,市场上真正属于SAAS应用的并不是特别多,还有很大一部分是ASP的模式在运行,不管对于公司还是技术部门都是很大的挑战.去年在做elearning项目的时候其实也就 ...

最新文章

  1. 为什么 P8 程序员的代码你写不出来?零拷贝了解一下
  2. STM32串口9位数据,无奇偶校验
  3. python的编译器有哪些-python的编译器有哪些
  4. js中的offset函数和position
  5. 中小学计算机教室设备维修记录,多媒体电教室的管理与设备的维护
  6. python re match groups_【原创】如何治疗使用python中re模块group、groups与findall分组匹配后产生的“眩晕反应”...
  7. php 跨域web访问权限,php:跨域 Web程序 - 贪吃蛇学院-专业IT技术平台
  8. wpf window 不执行show 就不能load执行_Numpy反序列化命令执行漏洞分析(CVE-2019-6446)附0day...
  9. 给定没有重复数字的序列,将其全排列
  10. 项目管理论坛_【项目管理论坛】 第15期:如何做一名优秀的项目经理
  11. libcurl使用方法
  12. 计算机双系统,自己在计算机上安装双系统
  13. java协程处理IO_并发编程 --进、线程池、协程、IO模型
  14. Linux学习笔记(一):Linux介绍
  15. 你的优势在哪?开宝马的学渣教会我的事
  16. 小红帽linux各功能中英,英文短剧lbrack;小红帽rsqb;剧本台词完整版---中英对照文本版...
  17. U8C报表模板已设置,任务已分配仍无法查看报表数据
  18. 米兔机器人恐龙拼图手册_米兔积木机器人(多形态组合、自平衡系统、App联动)...
  19. 【Unity】Jay 开发日志(四)——道具效果的实现(下)
  20. SiamCAR: Siamese Fully Convolutional Classification and Regression for Visual Tracking

热门文章

  1. oracle 变量赋值_【赵强老师】Oracle存储过程中的out参数
  2. 光子筛matlab,一种振幅调制器件产生椭圆涡旋光的方法与流程
  3. java 函数参数 返回值_java中如何用函数返回值作为post提交的参数?
  4. c语言visit函数指针,C++中的函数指针总结
  5. c语言源程序的下载,编程(C语言源程序代码)
  6. windows2012挂linux盘阵,磁盘阵(IPSAN)挂载Windows和Linux测试过程.doc
  7. linux tomcat 配置启动命令,# linux 之 配置tomcat开机自启动(systemctl)
  8. Java library util_sdejavautil.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家
  9. mysql 中的事务
  10. linux系统基础入门,虚惊一场