SuperColumn TMD到底是什么?Cassandra数据模型介绍
(三)
Translated by leo zheng
原文地址:WTF is a SuperColumn? An Intro to the Cassandra Data Model
By Arin Sarkissian Digg
TaggedPosts ColumnFamily
好的 —— 到这儿,事情变得有趣起来了。这个ColumnFamily将为我们处理较多的内容(This ColumnFamily is going to do some heavy lifting for us)。它不仅仅用来存储关联关系(译注:tag和blog之间的关联关系),而且允许我们通过某个tag来获取所有的已排序的blog(还记得我们前面提到的排序规则吗?)
有一个设计点我想要指出:在我们的系统中,每一个BlogEntry都会拥有一个称为“__notag__”的tag。对每一个BlogEntry打上“__notag__”标签使得我们可以使用这个ColumnFamily来按顺序存储所有的Blog。我们有点投机取巧,但是这确实使得我们可以用一个简单的ColumnFamily 来同时实现”获取所有最近发布的博客“ 以及”获取所有最近发布的标记为‘foo’的博客“这样的需求。
根据这个数据模型,如果一篇博客拥有3个tag,那么它将在4行中拥有相关Column。。。每一行对应一个tag,还有一行对应“__notag__”。
由于我们需要按照时间倒序的方式来显示blog,因此我们需要确保每个Column的name是一个time UUID,并且设置ColumnFamily的CompareWith属性为TimeUUIDType。这将按时间顺序排列Columns,满足我们的”按时间倒序排列“的需求 :) 因此”获取最近10篇标记为‘foo’的blog“将会十分高效。
现在,当我们想要显示最近的10篇blog时(例如:显示在首页),我们只需:
1. 获取key为”__notag__“(代表所有blog的tag)的行中的最后10个Column
2. 循环遍历这些Column
3. 在循环过程中,我们知道每个Column的value就是BlogEntries ColumnFamily中每一行的key
4. 我们使用这个值从BlogEntries ColumnFamily中获取这篇blog对应的行。这让我们得到这篇blog的所有数据
5. 我们刚才获取的BlogEntries 行中有一个称为“author”的column,它的值是Authors ColumnFamily的key,我们需要用它来获取author的数据
6. 到此,我们已经获得了blog和author的信息
7. 接下来,我们将分割“tags”Column的值来得到tags的列表
8. 现在,我们已经获得了需要显示的blog的所有信息(除了评论 —— 它不在同一页上)( no comments yet – this aint the permalink page)
依据以上的步骤,我们可以获取任何tag关联的blog。。。“所有的blog”和“标记为‘foo’的blog”。挺不错的。
<!--
ColumnFamily: TaggedPosts
一个辅助索引,用来决定哪些blog和一个tag关联
Row Key => tag
Column Names: a TimeUUIDType
Column Value: row key into BlogEntries CF
访问: 获取打上了‘foo’标签的blog
我们使用这个ColumnFamily来决定在某个tag页面要显示哪些blog
我们有点投机(We'll be a bit ghetto),使用__notag__ 来表示“没有tag限制”。在这儿,一篇blog就是一个column。。。这意味着每一篇blog对应#tags+1个column
TaggedPosts : { // CF
// 打上了“guitar”标签的blog
guitar : { // tag的名称是这一行的key
// column的name是 TimeUUIDType, value 是 BlogEntries的key
timeuuid_1 : i-got-a-new-guitar,
timeuuid_2 : another-cool-guitar,
},
// 这儿是所有的blog
__notag__ : {
timeuuid_1b : i-got-a-new-guitar,
// 这篇blog在“guitar”那行也有
timeuuid_2b : another-cool-guitar,
// 这篇blog在“movie”那行也有
timeuuid_2b : scream-is-the-best-movie-ever,
},
// blog entries tagged "movie"
movie: {
timeuuid_1c: scream-is-the-best-movie-ever
}
}
-->
<ColumnFamily CompareWith="TimeUUIDType" Name="TaggedPosts"/>
Comments ColumnFamily
最后,我们需要弄清楚怎样构造comments。这儿,我们会用到SuperColumns。
我们用一行表示一篇blog。每一行的key就是blog的slug。在每一行中,我们用一个SuperColumn来表示一条评论。SuperColumn的name是一个UUID,我们将使用TimeUUIDType。这能确保每一篇blog的所有评论按时间倒序排列。每个SuperColumn内的各个Column表示评论的各个属性(评论者的姓名、评论的时间等)。
看到了吧,这确实十分简单。。。没什么花哨的东西。
<!--
ColumnFamily: Comments
我们把所有的评论存储在这
Row key => row key of the BlogEntry
SuperColumn name: TimeUUIDType
访问: 获取一篇blog的所有评论
Comments : {
// scream-is-the-best-movie-ever这篇blog的所有评论
scream-is-the-best-movie-ever : { // row key = row key of BlogEntry
// 最早的评论排在最前面
timeuuid_1 : { // SC Name
// Columns对应评论的属性
commenter: Joe Blow,
email: joeb@example.com,
comment: you're a dumb douche, the godfather is the best movie ever
commentTime: 1250438004
},
... scream-is-the-best-movie-ever的更多评论
// 最新的评论排在最后
timeuuid_2 : {
commenter: Some Dude,
email: sd@example.com,
comment: be nice Joe Blow this isnt youtube
commentTime: 1250557004
},
},
// i-got-a-new-guitar这篇blog的所有评论
i-got-a-new-guitar : {
timeuuid_1 : { // SC Name
// Columns对应评论的属性
commenter: Johnny Guitar,
email: guitardude@example.com,
comment: nice axe dawg...
commentTime: 1250438004
},
}
..
// 其它blog对应的SuperColumn
}
-->
<ColumnFamily CompareWith="TimeUUIDType" ColumnType="Super"
CompareSubcolumnsWith="BytesType" Name="Comments"/>
哇哦!
(Woot!)
就是这样。我们的小小blog系统已经构造好了,可以准备运行了。以上的内容确实需要好好消化,在最后,是一个简短的 storage-conf.xml的配置:
<Keyspace Name="BloggyAppy">
<!-- other keyspace config stuff -->
<!-- CF definitions -->
<ColumnFamily CompareWith="BytesType" Name="Authors"/>
<ColumnFamily CompareWith="BytesType" Name="BlogEntries"/>
<ColumnFamily CompareWith="TimeUUIDType" Name="TaggedPosts"/>
<ColumnFamily CompareWith="TimeUUIDType" Name="Comments"
CompareSubcolumnsWith="BytesType" ColumnType="Super"/>
</Keyspace>
现在,你要做的是弄清楚如何在Cassandra中存储和获取数据 :) 这是通过Thrift接口来实现的。Thrift接口API的wiki页面上对各种使用方法有非常不错的介绍,因此我就不赘述了。通常情况下,你只需要编译 cassandra.thrift 文件,然后通过生成的代码来访问各个方法。但是你也可以通过Ruby客户端或者Python客户端来访问。
好了。。。希望这些对你有帮助,希望你已经理解了到底什么是SuperColumn,并开始搭建一些不错的项目。
分享到:
相关推荐
amily 是 Cassandra 数据模型的核心组成部分,用来组织和管理 Column 和 SuperColumn。在 Cassandra 中,一个 ColumnFamily 相当于传统数据库中的表,但它不遵循严格的行与列的关系,而是以键值对的形式存储数据,...
在Cassandra的数据模型中,SuperColumn家族是较旧的数据结构,它类似于传统关系数据库的表。一个SuperColumn家族由多个SuperColumns组成,每个SuperColumn又包含多个子列(或称为Columns)。这种结构允许数据以多维...
### Apache Cassandra 介绍 #### 一、概述 Apache Cassandra 是一套强大的开源分布式 Key-Value 存储系统,它被设计用于处理大规模数据的场景,并且能够实现高度的可伸缩性和容错性。Cassandra 不像传统的数据库...
Cassandra使用手册详细介绍了数据库的安装、配置、数据模型、命令行操作、Java编程接口Thrift的使用,测试以及具体的系统实例实现。手册的目的是为了让用户能够系统地理解和掌握Cassandra的使用方法,从而在实际的...
Cassandra采用了一种基于列族(Column Families)的数据模型,其中包含了Column、SuperColumn、ColumnFamily、Keyspaces、Row等核心概念。每个Keyspace可视为一个独立的命名空间,包含多个ColumnFamily。Row则是在...
Cassandra的数据模型允许模式的灵活性,意味着在存储数据时不必预先定义字段。你可以根据需要动态添加或删除字段,这对于大型部署尤其有用,因为它降低了重构数据模型的成本。 ### 真正的可扩展性 Cassandra支持...
Cassandra 的数据模型是基于列的,与传统的关系型数据库不同,它采用面向列的 ColumnFamily 模型,允许灵活的模式定义。数据存储在 ColumnFamily 中,类似于 BigTable 的表格。ColumnFamily 是由 Row(行)组成的,...
**Cassandra 入门指南** ...随着对Cassandra的理解加深,你可以探索更多高级特性,如分布式数据模型、分区策略、复制策略、索引和触发器等。Cassandra是一个强大且灵活的数据库解决方案,尤其适合处理海量分布式数据。
Apache Cassandra 是一个分布式数据库系统,特别设计用于处理大规模的数据分布于多台服务器上,具有高可用性和可扩展性。在1.2.5版本中,它提供了许多关键特性和改进,使得这个开源数据库更适合处理PB级别的数据。 ...
Cassandra CLI是Apache Cassandra数据库系统的一个命令行工具,它提供了与Cassandra集群交互的能力,包括连接到远程节点、创建或更新模式(schema)、设置和检索记录及列,以及查询节点和集群元数据。这个工具主要...
Cassandra的数据模型可以理解为四维或五维的哈希。它主要包含以下几个概念: 1. Cluster(集群):由多个Keyspace组成。 2. Keyspace(键空间):类似于数据库,包含多个ColumnFamily,每个ColumnFamily对应应用...
1. 数据模型:Cassandra采用键值对存储,支持ColumnFamily、SuperColumn和Column。其数据模型设计灵活,适合大规模数据存储。 2. 分布式架构:Cassandra基于一致性哈希,实现去中心化的数据分布,保证了系统的可扩展...
Cassandra的数据模型基于列族(ColumnFamily)和超级列(SuperColumn)。每个表(Keyspace)由多个列族组成,列族内包含行(Row),行由列(Column)组成。列族可以视为关系数据库中的表,行则是记录,列是记录中的...
4. **数据模型**:理解 Cassandra 的数据模型很重要,因为它基于列族(ColumnFamily)和超级列(SuperColumn)。在 Astyanax 中,你可以创建对应的实体类来映射这些概念。 5. **异步操作**:Astyanax 支持异步操作...
运行游戏只需执行SuperColumn.exe 文件即可,没有SuperColumn.sav与SuperColumn.dat文件也可,它会自动在当前目录分别创建一个,另外,在当前目录下还需要动画鼠标ButterFly.ani,若没有就调用系统缺省的箭头鼠标,...
NoSQL数据库与传统的关系型数据库在数据模型、事务处理、查询能力等方面存在显著差异。NoSQL数据库更注重水平扩展性、高并发处理能力和最终一致性,而传统的关系型数据库则强调事务的一致性和完整性。 #### 结语 ...
- **数据模型**: 支持嵌套结构的数据存储。 ##### 5. Redis - **介绍**: Redis是一个开源的内存数据结构存储,可以用作数据库、缓存和消息中间件。 - **数据结构**: 支持字符串、哈希表、列表、集合、有序集合等...