Cassandra 学习三 数据模型

   Cassandra如何存储数据的概述。

  集群(Cluster)

  ·Cassandra数据库分布在几个一起操作的机器上。最外层容器被称为集群。对于故障处理,每个节点包含一个副本,如果发生故障,副本将负责。Cassandra按照环形格式将节点排列在集群中,并为它们分配数据。

键空间 (Keyspace)(相当于关系型数据库的DataBase)

  键空间是Cassandra中数据的最外层容器。Cassandra中的一个键空间的基本属性是 -

  • 复制因子 - 它是集群中将接收相同数据副本的计算机数。
  • 副本放置策略 - 它只是把副本放置策略。我们有简单策略(机架感知策略),旧网络拓扑策略(机架感知策略)和网络拓扑策略(数据中心共享策略)等策略。
  • 列族(类似于关系型数据库中的表(Table)) - 键空间是一个或多个列族的列表的容器。列族又是一个行集合的容器。每行包含有序列。列族表示数据的结构。每个键空间至少有一个,通常是许多列族。

创建键空间的语法如下 -

CREATE KEYSPACE Keyspace name
WITH replication = {‘class‘: ‘SimpleStrategy‘, ‘replication_factor‘ : 3};

Cassandra列族示意如下:整个是一个列族,包含了两行,两行的列可以不一样。(类比关系型数据库,相当于整个表有两条记录Row key1和Row key2)

下面的示例可以让我们更好地理解Cassandra的数据存储:

Musician:                           ColumnFamily 1 (列族)
    bootsy:                         RowKey
        email: [email protected],    ColumnName:Value
        instrument: bass            ColumnName:Value
    george:                         RowKey
        email: [email protected]     ColumnName:Value
Band:                               ColumnFamily 2
    george:                         RowKey
        pfunk: 1968-2010            ColumnName:Value

另外,Cassandra还有一种可在列之间建立关联的超级列(Super Column),你可以往超级列中添加子列。

如果用JSON表示,一组存放在列族中的数据看起来是这样的:

Hotel {
    key: AZC_043 { name: Cambria Suites Hayden, phone: 480-444-4444,address: 400 N. Hayden Rd., city: Scottsdale, state: AZ, zip: 85255}
    key: AZS_011 { name: Clarion Scottsdale Peak, phone: 480-333-3333,address: 3000 N. Scottsdale Rd, city: Scottsdale, state: AZ, zip: 85255}
    key: CAS_021 { name: W Hotel, phone: 415-222-2222,address: 181 3rd Street, city: San Francisco, state: CA, zip: 94103}
    key: NYN_042 { name: Waldorf Hotel, phone: 212-555-5555,address: 301 Park Ave, city: New York, state: NY, zip: 10019} }

使用Cassandra创建键空间Hotelier,列族为Hotel,并查询行键(Row Key)为“NYN_042”的结果,

cassandra> get Hotelier.Hotel[‘NYN_042‘] => (column=zip, value=10019, timestamp=3894166157031651) => (column=state, value=NY, timestamp=3894166157031651) => (column=phone, value=212-555-5555, timestamp=3894166157031651)=> (column=name, value=The Waldorf=Astoria, timestamp=3894166157031651) => (column=city, value=New York, timestamp=3894166157031651)

列(Column)Cassandra的列是一组键值对(和关系型数据库中的列不一样)

使用JSON描述的列结构:

{
    "name": "email",
    "value: "[email protected]",
    "timestamp": 1274654183103300
}

超级列(Super Column)的结构:(键值对的嵌套)


最后让我们来巩固一下Cassandra和关系型数据库的区别吧:


  • 没有查询语言:No SQL (Structured Query Language);
  • 没有外键约束:关系型数据库的最重要特征;
  • 双重簇索引:在关系型数据库中,每个表只能指定一个簇索引,其它的索引查询都会导致全表扫描,但在Cassandra中,我们可以有第二级的簇索引;
  • 排序是在设计时决策:Cassandra不支持Order By,排序是需要设计时考虑,而不是像在关系型数据库查询时刻使用Order By;
  • 无数据结构约定:这是Cassandra最大的优势,在关系型数据库中,我们设计数据库结构时总是慎之又慎,但在Cassandra中不需要预先约定数据结构。
 

原文地址:https://www.cnblogs.com/liufei1983/p/9363150.html

时间: 2024-10-28 10:50:26

Cassandra 学习三 数据模型的相关文章

cassandra学习 四 数据模型

Keyspace(建空间): 可以理解为Database: Replication factor: 复制因数 :   Replica placement srategy: 复制策略,默认是SimpleStrategy Column Family(列族) / Column (列) 可以理解为table:    Column 包含了Timestamp.作用是当有新数据覆盖的时候,部署直接将老数据从存储介质上删除,而是直接写入新数据.老数据会在一段时间后删除. Row可以理解为一条记录,Column其

[原创]Cassandra的基本数据模型之自底向上

一 简介 对于那些习惯了关系型数据库的人来说,学习Cassandra有一定的困难.Cassandra有很多新的术语,与关系型DB中的术语既类似但本质上又不相同.这里我们主要从两个角度来学习Cassandra的数据模型:自底向上和自顶向下. 二 自底向上理解Cassandra的数据模型 Cassandra被归类于NoSQL数据库,其根本原因在于它的设计不像关系型DB那样需要预告定义属性列.Cassandra是按列进行存储的,通常我们可以想像为以下这种模型: 但是使用这种数据模型来存储数据之后,如果

[原创]Cassandra的基本数据模型之自顶向下

一 序言 在前面的文章中,我简单地讲述了一下在windows平台上cassandra的安装与启动,并以自底向上的视角来讲述了cassandra的基本数据模型.在我学习一个新的事物之前,我认为最好的方法就是先在宏观上了解一下这个事物,然后再从细节上着手.本篇文章就从自顶向下的视角来分析cassandra的数据模型. 二 集群的概念 Cassandra在设计之初就考虑到了跨越多台主机共同工作,对用户呈现一个整体的分布式系统架构的需求.所以,应此需求而生的就是Cassandra的最外层结构是集群(Cl

Struts2框架学习(三) 数据处理

Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:ValueStack一种数据结构,操作数据的方式为:先进后出 OGNL : Object-GraphNavigation Language(对象图形导航语言)将多个对象的关系使用一种树形的结构展现出来,更像一个图形,那么如果需要对树形结构的节点数据进行操作,那么可以使用 对象.属性 的方式进行操作,OGNL技

u-boot学习(三):u-boot源码分析

建立域模型和关系数据模型有着不同的出发点: 域模型: 由程序代码组成, 通过细化持久化类的的粒度可提高代码的可重用性, 简化编程 在没有数据冗余的情况下, 应该尽可能减少表的数目, 简化表之间的参照关系, 以便提高数据的访问速度 Hibernate 把持久化类的属性分为两种: 值(value)类型: 没有 OID, 不能被单独持久化, 生命周期依赖于所属的持久化类的对象的生命周期 实体(entity)类型: 有 OID, 可以被单独持久化, 有独立的生命周期(如果实体类型包含值类型,这个值类型就

算法学习三阶段

?? 第一阶段:练经典经常使用算法,以下的每一个算法给我打上十到二十遍,同一时候自己精简代码, 由于太经常使用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都能够把程序打 出来. 1.最短路(Floyd.Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal 要用并查集,不好写) 3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内) 5.叉乘.判线段相交.然后写个凸包. 6.BFS.DFS,同一时候熟练hash 表(要熟,要灵活,代码要

Jetty学习三:配置概览-需要配置什么

上一节讲述了怎么配置Jetty,这节将告诉你使用Jetty你需要配置些什么. 配置Server Server实例是Jetty服务端的中心协调对象,它为所有其他Jetty服务端组件提供服务和生命周期管理.在标准Jetty发布中,核心的服务端配置是在etc/jetty.xml文件中,你也能在其中包含其他服务端配置,可以包括: 1)ThreadPool Server实例提供了一个线程池,你可以在etc/jetty.xml中配置最大线程数和最小线程数. 2)Handlers Jetty服务端只能有一个H

ZigBee学习三 UART通信

ZigBee学习三 UART通信 本实验只对coordinator.c文件进行改动就可以实现串口的收发. 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique message ID (counter) afAddrType_t GenericApp_DstAddr; unsigned char uartbuf[128];/**************************************************

Spark学习三:Spark Schedule以及idea的安装和导入源码

Spark学习三:Spark Schedule以及idea的安装和导入源码 标签(空格分隔): Spark Spark学习三Spark Schedule以及idea的安装和导入源码 一RDD操作过程中的数据位置 二Spark Schedule 三Idea导入spark源码 一,RDD操作过程中的数据位置 [hadoop001@xingyunfei001 spark-1.3.0-bin-2.5.0]$ bin/spark-shell --master local[2] val rdd = sc.t