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_ ...
随机推荐
- Redis 集合(Set)
Redis的Set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1). 集合中最 ...
- 小白日记40:kali渗透测试之Web渗透-SQL手工注入(二)-读取文件、写入文件、反弹shell
SQL手工注入 1.读取文件[load_file函数] ' union SELECT null,load_file('/etc/passwd')--+ burpsuite 2.写入文件 ' unio ...
- MySQL Index Condition Pushdown(ICP) 优化
本文是作者留下的一个坑,他去上茅坑了.茅坑是谁?你猜.
- dede只调用当天发布的文档
dede只调用当天发布的文档 dede文章的调用 我需要织梦的模板分别调用,一天内发布的文章,三天内发布的文章,和七天内发布的文章,请问是代码是怎么写的,如何调用,如图所示. 点一天内,显示最近24的 ...
- poj 3249 拓扑排序 and 动态规划
思路:我们首先来一遍拓扑排序,将点按先后顺序排列于一维数组中,然后扫描一遍数组,将每个点的出边所连接的点进行更新,即可得到最优解. #include<iostream> #include& ...
- 查锁表及kill
当一个表一直被锁住而无法进行操作的时候,可以用如下方法 select l.session_id sid, s.serial#, l.locked_mode 锁模式, l.oracle_username ...
- hdu 2004 成绩转换
成绩转换 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- .NET学习笔记(1)— C#学习路线图
目录 一:引言 二:.NET技术体系 三:常用工具汇总 四:学习资源汇总 五:书籍推荐 六:关于阅读技术书籍的经验 七:总结 一:引言 因为工作调整,从PHP开发零基础转型到.NET开发,前期没有 ...
- linq检索带命名空间的xml
XElement el = XElement.Load(fil); XNamespace ns = "http://schemas.microsoft.com/ado/2009/11/edm ...
- Tomcat - 持久化 Session
Session 是保存在内存中的,如果服务器重启.宕机的话,Session 就会丢失.有时候,我们需要对 Session 持久化以应对意外的情况发生.例如,客户端与服务器在交互过程中,可能因为 Ses ...