Cassandra1.2文档学习(18)—— CQL数据模型(下)
三、集合列
CQL 3 引入了一下集合类型:
•set
•list
•map
在关系型数据库中,允许用户拥有多个email地址,你可以创建一个email_addresses表与users表存在一个多对一关系。CQL 3能够处理经典的多个电子邮件地址的使用情况,其他使用的情况下可以通过定义的列达到集合的效果。利用集合来解决多个邮件地址的问题是方便和直观的。
集合类型的另一个用途被证明可以使用音乐服务作为例子。
四、往表中增加一个集合
上面说的音乐服务的例子包括给歌曲标记标签。从一个关系的角度看,你可以认为把存储行引擎视为分区,包含了聚集的行。为了给歌曲打标签,使用集合类型set。定义集合通过CREATE TABLE或者ALTER TABLE语句。因为songs表已经存在在刚才的例子中了,仅仅修改表是的添加一个集合set——tags:
ALTER TABLE songs ADD tags set<text>;
五、更新一个集合
更新songs 表插入tags 数据:
UPDATE songs SET tags = tags + {'2007'}
WHERE id = 8a172618-b121-4136-bb10-f665cfc469eb;
UPDATE songs SET tags = tags + {'covers'}
WHERE id = 8a172618-b121-4136-bb10-f665cfc469eb;
UPDATE songs SET tags = tags + {'1973'}
WHERE id = a3e64f8f-bd44-4f28-b8d9-6938726e34d4;
UPDATE songs SET tags = tags + {'blues'}
WHERE id = a3e64f8f-bd44-4f28-b8d9-6938726e34d4;
UPDATE songs SET tags = tags + {'rock'}
WHERE id = 7db1a490-5878-11e2-bcfd-0800200c9a66;
一个音乐评论列表和演出时间表(mao集合)可以添加到表:
ALTER TABLE songs ADD reviews list<text>;
ALTER TABLE songs ADD venue map<timestamp, text>;
map的每一个元素,list或者map内部存储为Cassandra的一列。为了更新一个集合,使用UPDATE命令和加 (+) 操作符去增加一个元素和减 (-) 操作符去移除一个元素。例如,更新一个集合:
UPDATE songs
SET tags = tags + {'rock'}
WHERE id = 7db1a490-5878-11e2-bcfd-0800200c9a66;
更新一个列表,使用方括号代替花括号,其他语法相似。
UPDATE songs
SET reviews = reviews + [ 'hot dance music' ]
WHERE id = 7db1a490-5878-11e2-bcfd-0800200c9a66;
更新一个map,使用INSERT :
INSERT INTO songs (id, venue)
VALUES (7db1a490-5878-11e2-bcfd-0800200c9a66,
{ '2013-9-22 12:01' : 'The Fillmore',
'2013-10-1 18:00' : 'The Apple Barrel'});
插入数据到map中会替换整个map。
六、查询一个集合
去查询一个集合,在select表达式中包含集合列的名字。
SELECT id, tags FROM songs;
SELECT id, venue FROM songs;
七、什么时候使用集合
当你想存储或者反规范化一小段数据的时候可以使用集合。集合中项目的值应当小于64K。其他的限制也适用。当存储类似于用户的电话号码、email的标签这些数据的时候集合工作的非常好。如果你需要存储的数据具有无限增长的潜力,如用户发送的信息和传感器接受的事件,请不要不使用集合。相反地,使用一个具有复合主键的表,存储数据在聚类列中。
八、到期的列
列中的数据可以有一个可选的叫做TTL(生存时间)的截止日期。每当一个列数据被插入时,客户端可以为列中的数据指定一个可选的TTL值,定义的单位为秒。当请求的时间的已经过期,TTL的列标记视为删除的数据(通过一个墓碑)。当列被一个墓碑标记,它们会自动删除在正常的压紧(通过gc_grace_seconds定义) 和修复过程。
可以使用CQL去设置列的TTL。
如果你想改变的列一个到期的TTL,你必须重新插入包含一个新的TTL的列。Cassandra中,列的插入是一个插入或更新操作,这取决于是否以前版本的列的存在。这意味着要更新一个未知值的列的TTL,你必须阅读该列,然后重新插入它(带有新的TTL值)。
TTL列有一个精确的秒,在服务器上的计算。因此,一个非常小的TTL可能没有什么意义。此外,在服务器上的时钟应当是同步的;否则会出现进度减少的现象,因为截止时间在在最初接收到插入的私人的主机上计算,但是在集群中其他节点发现。
一个过期的列相比于正常的列来说在内存和硬盘会有8字节的额外开销(记录TTL过期时间)。
九、反列
一个反列是一个特殊的列存储了一个数字,这个数字是用来计数一个特定的事件或过程。例如,你可能使用一个反列去计算一张页面被访问的次数,
反列必须使用 Counter数据类型。反列只能存储在专用的表中。
当一个反列被定义以后,客户端程序更新反列通过增加(减少)操作。客户端通过传递名字和增加(减少)的值更新数据,无需时间戳。
在内部,反列的结构有一点复杂。Cassandra跟踪计数器分布状态通过一个服务器给定时间戳。因为这个原因,集群中所有的节点始终同步使用同一个源(比如NTP——网络时间协议)是重要的。
不像正常的列,一个对计数器的写入需要在后台的读取去保证副本之间值是一致的。典型的,对于计数器你可以使用一致性级别ONE,因为在一个写入的操作中,隐式读不会影响写入延迟。
十、利用自然键或替代的主键
对于表的一个考虑是是否使用代理或自然的主键。一个代理键是一个自动生成的键(如UUID)用来唯一标识一行,但是没有与行中具体的数据相关。
对于某些表来说,可能会包含生成的独一无二的的并且不会在行创建之后再更新的数据。例如,用户表中用户的名字。这叫做一个自然键。自然键是数据更可读并且移除了附加索引或反规范化的需要。然而,除非你的客户端程序确保唯一性,它可能会覆盖数据列。
Cassandra1.2文档学习(18)—— CQL数据模型(下)的更多相关文章
- Cassandra1.2文档学习解读计划——为自己鼓劲
最近想深入研究一下Cassandra,而Cassandra没有中文文档,仅有的一些参考书都是0.7/0.6版本的.因此有个计划,一边学习文档(地址:http://www.datastax.com/do ...
- Cassandra1.2文档学习(17)—— CQL数据模型(上)
参考文档:http://www.datastax.com/documentation/cql/3.0/webhelp/index.html#cql/ddl/ddl_anatomy_table_c.ht ...
- 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_ ...
随机推荐
- SQL Server 数学函数 相关
1.计算绝对值ABS ABS函数对一个数值表达式结果计算绝对值(bit数据类型除外),返回整数. 语法结构: ABS(数值表达式) 返回值:与数值表达式类型一致的数据 示例: SELECT ABS ...
- C#_Jquery无刷新上传
昨晚网友有下载了一个jQuery无刷新上传的小功能,他尝试搬至ASP.NET MVC应用程序中去,在上传死活无效果.Insus.NET使用Teamviewer远程桌面,操作一下,果真是有问题.网友是说 ...
- HDU 4279 - Number
2012年天津赛区网赛的题目,想了好久,也没能想出来 还是小杰思路敏捷,给我讲解了一番,才让我把这个题做出来 f(x)=x-phi(x)(1——x与x互素个数)-g(x)(x的因子个数)+1 其中g( ...
- VS VC++ 设置版本号
我并不是专职的VC++的开发者,只是有时候偶尔要开发一些C++的DLL,每当要发布新版本的时候,隔得时间长一点总会忘记了在那里设置生成文件的版本号. 在这里把VC++设置的步骤记录下来,以备忘! 设置 ...
- c语言指针函数与函数指针
例一:指针函数 指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个 ...
- Cable master
Description Inhabitants of the Wonderland have decided to hold a regional programming contest. The J ...
- SRM 584 第一次玩TopCoder。。。只水题一道。。。
第一次topcoder,以前老感觉没有资格去做tc,cf什么的,现在已经慢慢接触了. 感觉还可以,还是有让我们这些蒻菜安慰的水题. tc的确很好玩,用客户端比赛,还有各种规则,而且还是只编写一个类提交 ...
- [课程相关]homework-07
我读的博客: C++11中值得关注的几大变化 C++11 中的线程.锁和条件变量 C++开发者都应该使用的10个C++11特性 开始使用C++11的9个理由 我的问题: 1.有一句话:“C++像难懂的 ...
- 两个UIView添加同一个手势只有最后一个有用
首先这个思路是不对的,因为每一个Gesture Recognizer关联一个View,但是一个View可以关联多个Gesture Recognizer,因为一个View可能还能响应多种触控操作方式.当 ...
- python django第一天
django第一天,上一次是使用了virtualenv(沙盒),这一次就直接用virtualenv直接建一个django的环境,用来自己练着试试django: source django/Script ...