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).関連関係を格納するだけでなく、ソートされたすべてのblogを取得することができます(前に述べたソートルールを覚えていますか?)
私たちのシステムでは、BlogEntryごとに「_notag_」と呼ばれるものがあることを指摘したい設計点があります.を選択します.各BlogEntryに「_notag_」を打つラベルを使用すると、このColumnFamilyを使用してすべてのBlogを順番に格納できます.私たちは少し投機的ですが、これは確かに簡単なColumnFamilyで「最近発表されたすべてのブログを取得する」と「最近発表されたすべてのブログを取得する」というニーズを同時に実現することができます.
このデータモデルによれば、ブログに3つのtagがある場合、関連するColumnは4行に存在します.の各行はtagに対応し、もう1行は「_notag_」に対応する.時間の逆順序でblogを表示する必要があるため、各Columnのnameがtime UUIDであることを確認し、ColumnFamilyのCompareWithプロパティがTimeUUIDTypeであることを設定する必要があります.これにより、Columnsは時間順に並べられ、私たちの「時間逆配列」のニーズを満たすことができます:)そのため、「foo」とマークされた最近のblog 10編を取得する」ことは非常に効率的です.
今、最近の10編のblogを表示したい場合(例えば、トップページに表示)、私たちは:1.取得keyは"_notag__「(すべてのblogを表すtag)の行の最後の10 Column 2.これらColumn 3を巡回する.ループの過程で、各ColumnのvalueはBlogEntries ColumnFamilyの各行のkey 4であることを知っています.この値を使用して、BlogEntries ColumnFamilyからこのblogに対応するローを取得します.このブログのすべてのデータを得ることができます.私たちがさっき取得したBlogEntries行には「author」というcolumnがあります.その値はAuthors ColumnFamilyのkeyです.authorのデータ6を取得する必要があります.ここで、blogとauthorの情報を得ました.次に、「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を使います.私たちは1行で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: [email protected],
                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: [email protected],
                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: [email protected],
                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なのかを理解して、そしていくつかの良いプロジェクトを構築し始めたことを望んでいます.