参考文档:http://www.datastax.com/documentation/cql/3.0/webhelp/index.html#cql/ddl/ddl_anatomy_table_c.html#concept_ds_qqw_1dy_zj

  在一个层次上来说,Cassandra中的表、行和列可以认为和关系型数据库是相同的。在SQL和CQL中你可以定义表(包含已经定义好的行和与之相关的数据类型),你可以创建索引去增加查询效率。

  然而,一个重要的不同是因为Cassandra是被设计来分组成为一个分布式的系统,它强调使用逆规范化代替规范化和连接,它提供了了工具(如集合)去支持。

一、例子——音乐服务

  这是一个关于音乐服务的例子,需要一张音乐表songs,包含标题、唱片集、艺术家列以及外加的名为数据(包含真实音频文件的)的列。这张表使用一个UUID座位主键。

CREATE TABLE songs (

id uuid PRIMARY KEY,

title text,

album text,

artist text,

data blob

);

  在关系型数据库中,你应当创立一个播放列表playlists通过一个外键和音乐表相关联。但是在Cassandra中,你反规范化数据。为了表示播放列表的数据,你可以创建一张如下的表:

CREATE TABLE playlists (

id uuid,

song_order int,

song_id uuid,

title text,

album text,

artist text,

PRIMARY KEY  (id, song_order )

);

  在playlists表中,id和song_order的组合可以唯一标识一行。你可以超过一行的数据包含相同的id只要song_order不同即可。

提示: UUID可以方便在多个机器中排序或者自动增加。简单地说,int类型的song_order就是一个例子。

  当插入样本数据到播放列表后,选择所有数据的输出会像以下:

SELECT * FROM playlists;

  下面的例子演示如何创建一个查询,使用艺术家作为过滤器。首先,添加更多的数据到播放列表中来让事情变得有趣:

INSERT INTO playlists (id, song_order, song_id, title, artist, album)

VALUES (62c36092-82a1-3a00-93d1-46196ee77204, 4,

7db1a490-5878-11e2-bcfd-0800200c9a66,

'Ojo Rojo', 'Fu Manchu', 'No One Rides for Free');

  通过之前给出的模式,一个以艺术家作为过滤的查询会要求对整个播放列表数据集进行一个顺序有序的扫描。Cassandra会拒绝这样的扫描,如果你首先在artist创建了一个索引,Cassandra会高效的给出记录。

  CREATE INDEX ON playlists(artist );

  

  现在,你可以查询出Fu Manchu的歌,例如:

  SELECT * FROM playlists WHERE artist = 'Fu Manchu';

  输出结果如下:

二、复合键和聚类

  一个聚合主键包含了分区键(决定数据存储在哪一个节点上),一个或多个列决定了聚类。Cassandra使用复合主键的第一个键作为分区键。例如,在playlists表中,id是分区键。剩余的其他列,或者说是除了主键中非分区键决定了聚类。在playlists表中, song_order就是聚类键。每个分区上的数据按照聚类键聚集。在一个物理节点中,当行的分区键中存储的顺序基于聚类的列,检索的行是非常有效的。例如,因为id在playlists表是分区键,播放列表中所有的歌曲按照song_order列聚集。

  在一张表上的行上插入、更新和删除操作分享相同的分区键原子执行并且是隔离的。

  你可以通过一个书序的查询去获得播放列表的数据:

SELECT * FROM playlists WHERE id = 62c36092-82a1-3a00-93d1-46196ee77204

ORDER BY song_order DESC LIMIT 50;

  输出如下:

  Cassandra通过分区键在节点上存储数据。如果你有很多数据再分去上,希望能够将数据分散在多个节点,可以使用复合分区键。

Cassandra1.2文档学习(17)—— CQL数据模型(上)的更多相关文章

  1. Cassandra1.2文档学习解读计划——为自己鼓劲

    最近想深入研究一下Cassandra,而Cassandra没有中文文档,仅有的一些参考书都是0.7/0.6版本的.因此有个计划,一边学习文档(地址:http://www.datastax.com/do ...

  2. Cassandra1.2文档学习(18)—— CQL数据模型(下)

    三.集合列 CQL 3 引入了一下集合类型: •set •list •map 在关系型数据库中,允许用户拥有多个email地址,你可以创建一个email_addresses表与users表存在一个多对 ...

  3. Cassandra1.2文档学习(19)—— CQL索引

    参考文档:http://www.datastax.com/documentation/cql/3.0/webhelp/index.html#cql/ddl/ddl_primary_index_c.ht ...

  4. Cassandra1.2文档学习(15)—— 配置数据一致性

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_config ...

  5. Cassandra1.2文档学习(1)——Cassandra基本说明

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...

  6. Cassandra1.2文档学习(16)—— 模式的变化

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_schema ...

  7. Cassandra1.2文档学习(13)—— 数据读取

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_about_ ...

  8. Cassandra1.2文档学习(4)——分区器

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...

  9. Cassandra1.2文档学习(14)—— 事务和并发控制

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_about_ ...

随机推荐

  1. C++编程对缓冲区的理解

    本文转自:http://www.vckbase.com/index.php/wv/1592 什么是缓冲区 缓冲区又称为缓存,它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空 ...

  2. Windows下用Eclipse搭建C/C++开发环境

    本文假定你已经熟悉Java,Eclipse的安装,并能顺利启动和运行Eclipse.此外因为各软件版本在不断更新,有些地方可能不准确,以最新的.原文资料为准. 距上一次写和调C++程序,已经5.6年了 ...

  3. MYSQL基础笔记(六)- 数据类型一

    数据类型(列类型) 所谓数据烈性,就是对数据进行统一的分类.从系统角度出发时为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中讲数据类型分成三大类:1.数值类型,2.字符串类型和时间日期 ...

  4. PHP读书笔记(5)-结构语句

    PHP结构语句 顺序结构 顺序结构就像一条直线,按着顺序一直往下执行.我们编写的代码默认都是按照顺序结构执行的. 条件结构之if…else… 条件结构就像一个岔路口,可以向左走,也可以向右走.比如上洗 ...

  5. session超时和cookie过期

    一.Cookie的过期和Session的超时有什么区别? 会话的超时由服务器来维护,它不同于Cookie的失效日期.首先,会话一般基于驻留内存的cookie不是持续性的cookie,因而也就没有截至日 ...

  6. mysql导入数据load data infile用法

    mysql导入数据load data infile用法 基本语法: load data [low_priority] [local] infile 'file_name txt' [replace | ...

  7. MultiMap、BidiMap及LazyMap的使用

    一.MultiMap 在日常的开发工作中,我们有的时候需要构造像Map<K, List<V>>或者Map<K, Set<V>>这样比较复杂的集合类型的数 ...

  8. JavaScript “\”替换成 “\\”

    str=str.replace(/\\/g,'\\\\');

  9. Git CMD - config: Get and set repository or global options

    命令参数 --get 获取指定的配置项. --global 对于写选项:全局配置,将参数配置于 ~/.gitconfig 而不是仓库目录下的 .git/config.对于读选项:只从 ~/.gitco ...

  10. 【AngularJs】---$sce 输出Html

    [问题描述] angular js的强大之处之一就是他的数据双向绑定功能----->ng-bind和针对form的ng-model 但在我们的项目当中会遇到这样的情况,后台返回的数据中带有各种各 ...