Cassandra1.2文档学习(17)—— CQL数据模型(上)
参考文档: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数据模型(上)的更多相关文章
- Cassandra1.2文档学习解读计划——为自己鼓劲
最近想深入研究一下Cassandra,而Cassandra没有中文文档,仅有的一些参考书都是0.7/0.6版本的.因此有个计划,一边学习文档(地址:http://www.datastax.com/do ...
- Cassandra1.2文档学习(18)—— CQL数据模型(下)
三.集合列 CQL 3 引入了一下集合类型: •set •list •map 在关系型数据库中,允许用户拥有多个email地址,你可以创建一个email_addresses表与users表存在一个多对 ...
- Cassandra1.2文档学习(19)—— CQL索引
参考文档:http://www.datastax.com/documentation/cql/3.0/webhelp/index.html#cql/ddl/ddl_primary_index_c.ht ...
- Cassandra1.2文档学习(15)—— 配置数据一致性
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_config ...
- Cassandra1.2文档学习(1)——Cassandra基本说明
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...
- Cassandra1.2文档学习(16)—— 模式的变化
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_schema ...
- Cassandra1.2文档学习(13)—— 数据读取
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_about_ ...
- Cassandra1.2文档学习(4)——分区器
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...
- Cassandra1.2文档学习(14)—— 事务和并发控制
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_about_ ...
随机推荐
- System.Data.SQLite.EF6
2015.1.21 到目前为止这个破玩意不支持code first 建数据库 建表 代替方案 SQL Server Compact -------------------------------- ...
- php的引用&(就是在变量或者函数、对象等前面加上&符号)
官方文档: 1.引用是什么:http://www.php.net/manual/zh/language.references.whatare.php 2.引用做什么:http://www.php.ne ...
- SQL Insert语句数据以以unicode码存储 解决存储数据出现乱码的问题
写了个读取原始的文本数据导入数据库的工具 ,最后发现空中有几个值是乱码 例如 原始数据是 :Bjørn 存到数据库中是 Bj?rn 研究半天发现是一直以来忽略了一个标记‘N’ 2条 Insert 语句 ...
- Jquery解析Json字符串,并且动态生成数据表格Table
//ajax获得后台传来的json字符串 $.post("UserInfo.ashx", function (data) { //假设data="{T1:[{User_I ...
- WordPress搬家全攻略
零.前言 我自己有两个博客,一个是你看到的这个,专门用来写我的技术文章:另一个是我自己的心情记录博客,专门记录和技术无关的东西. 之前我的心情记录博客一直放在openshift上面,这是redhat官 ...
- tomcat初识
1.新工作使用tomcat,顺便就把tomcat搜了搜,看了下基础 官网:http://tomcat.apache.org/ 打开官网会发现很多版本6,7,8,9,这些版本都有什么区别呢?tomcat ...
- Scala中的元组
元组 元组使用()表示的数据结构 元组使用()表示的数据结构 还可以使用模式匹配访问 使用场景非常有限,用于函数返回值不止1个的情况下 看代码: /** * 元组 * @author Administ ...
- .net 创建属于自己的log类
实习到现在已经接近三个月了,由于是校企联合培养计划,所以没有工资,所幸公司对于我们这些实习生并没有什么要求,刚开始我还觉得要做点什么才能学得快,可是到了后来,发现公司安排给我们的任务并不紧要,也不算太 ...
- 纯CSS制作“跳动的心”demo
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- Java之绘制二次曲线
前面已经介绍过绘制方法.这里不再赘述. 画一下草图来看看:灰色表示X值,红色表示Y值. 在这里要值得注意的是:当我们把它们的坐标在纸上画出来时,就会觉得“有问题”了,你看A(60,20,120,100 ...