`
zhengenyang
  • 浏览: 7651 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

SuperColumn TMD到底是什么?Cassandra数据模型介绍(三)

阅读更多

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,并开始搭建一些不错的项目。

分享到:
评论

相关推荐

    Cassandra的数据模型介绍

    amily 是 Cassandra 数据模型的核心组成部分,用来组织和管理 Column 和 SuperColumn。在 Cassandra 中,一个 ColumnFamily 相当于传统数据库中的表,但它不遵循严格的行与列的关系,而是以键值对的形式存储数据,...

    cassandra 插入superColumn

    在Cassandra的数据模型中,SuperColumn家族是较旧的数据结构,它类似于传统关系数据库的表。一个SuperColumn家族由多个SuperColumns组成,每个SuperColumn又包含多个子列(或称为Columns)。这种结构允许数据以多维...

    cassandra介绍

    ### Apache Cassandra 介绍 #### 一、概述 Apache Cassandra 是一套强大的开源分布式 Key-Value 存储系统,它被设计用于处理大规模数据的场景,并且能够实现高度的可伸缩性和容错性。Cassandra 不像传统的数据库...

    Cassandra使用手册

    Cassandra使用手册详细介绍了数据库的安装、配置、数据模型、命令行操作、Java编程接口Thrift的使用,测试以及具体的系统实例实现。手册的目的是为了让用户能够系统地理解和掌握Cassandra的使用方法,从而在实际的...

    Cassandra架构与应用

    Cassandra采用了一种基于列族(Column Families)的数据模型,其中包含了Column、SuperColumn、ColumnFamily、Keyspaces、Row等核心概念。每个Keyspace可视为一个独立的命名空间,包含多个ColumnFamily。Row则是在...

    cassandra教程

    Cassandra的数据模型允许模式的灵活性,意味着在存储数据时不必预先定义字段。你可以根据需要动态添加或删除字段,这对于大型部署尤其有用,因为它降低了重构数据模型的成本。 ### 真正的可扩展性 Cassandra支持...

    [NOSQL] Cassandra 数据库系统简单介绍.doc

    Cassandra 的数据模型是基于列的,与传统的关系型数据库不同,它采用面向列的 ColumnFamily 模型,允许灵活的模式定义。数据存储在 ColumnFamily 中,类似于 BigTable 的表格。ColumnFamily 是由 Row(行)组成的,...

    cassandra入门demo

    **Cassandra 入门指南** ...随着对Cassandra的理解加深,你可以探索更多高级特性,如分布式数据模型、分区策略、复制策略、索引和触发器等。Cassandra是一个强大且灵活的数据库解决方案,尤其适合处理海量分布式数据。

    apache-cassandra-1.2.5

    Apache Cassandra 是一个分布式数据库系统,特别设计用于处理大规模的数据分布于多台服务器上,具有高可用性和可扩展性。在1.2.5版本中,它提供了许多关键特性和改进,使得这个开源数据库更适合处理PB级别的数据。 ...

    cassandra cli 命令 大全

    Cassandra CLI是Apache Cassandra数据库系统的一个命令行工具,它提供了与Cassandra集群交互的能力,包括连接到远程节点、创建或更新模式(schema)、设置和检索记录及列,以及查询节点和集群元数据。这个工具主要...

    cassandra 最新文档

    Cassandra的数据模型可以理解为四维或五维的哈希。它主要包含以下几个概念: 1. Cluster(集群):由多个Keyspace组成。 2. Keyspace(键空间):类似于数据库,包含多个ColumnFamily,每个ColumnFamily对应应用...

    Cassandra在360的实践与改进(22页).pdf

    1. 数据模型:Cassandra采用键值对存储,支持ColumnFamily、SuperColumn和Column。其数据模型设计灵活,适合大规模数据存储。 2. 分布式架构:Cassandra基于一致性哈希,实现去中心化的数据分布,保证了系统的可扩展...

    reactivecassandra:React式Cassandra编程示例

    Cassandra的数据模型基于列族(ColumnFamily)和超级列(SuperColumn)。每个表(Keyspace)由多个列族组成,列族内包含行(Row),行由列(Column)组成。列族可以视为关系数据库中的表,行则是记录,列是记录中的...

    java-cassandra-quickstart:Java 和 Cassandra 快速入门 (Astyanax + CQL)

    4. **数据模型**:理解 Cassandra 的数据模型很重要,因为它基于列族(ColumnFamily)和超级列(SuperColumn)。在 Astyanax 中,你可以创建对应的实体类来映射这些概念。 5. **异步操作**:Astyanax 支持异步操作...

    超级Column游戏

    运行游戏只需执行SuperColumn.exe 文件即可,没有SuperColumn.sav与SuperColumn.dat文件也可,它会自动在当前目录分别创建一个,另外,在当前目录下还需要动画鼠标ButterFly.ani,若没有就调用系统缺省的箭头鼠标,...

    关于NoSQL的一些概要知识

    NoSQL数据库与传统的关系型数据库在数据模型、事务处理、查询能力等方面存在显著差异。NoSQL数据库更注重水平扩展性、高并发处理能力和最终一致性,而传统的关系型数据库则强调事务的一致性和完整性。 #### 结语 ...

    NoSQL数据库笔谈

    - **数据模型**: 支持嵌套结构的数据存储。 ##### 5. Redis - **介绍**: Redis是一个开源的内存数据结构存储,可以用作数据库、缓存和消息中间件。 - **数据结构**: 支持字符串、哈希表、列表、集合、有序集合等...

Global site tag (gtag.js) - Google Analytics