1

私はcassandraとastyanaxを使用してブログを開発しています。もちろん、これは単なる演習です。

CF_POST_INFO列ファミリーを次のようにモデル化しました。

private static class PostAttribute {

    @Component(ordinal = 0)
    UUID postId;

    @Component(ordinal = 1)
    String category;

    @Component
    String name;

    public PostAttribute() {}

    private PostAttribute(UUID postId, String category, String name) {
        this.postId = postId;
        this.category = category;
        this.name = name;
    }

    public static PostAttribute of(UUID postId, String category, String name) {
        return new PostAttribute(postId, category, name);
    }
}

    private static AnnotatedCompositeSerializer<PostAttribute> postSerializer = new AnnotatedCompositeSerializer<>(PostAttribute.class);

private static final ColumnFamily<String, PostAttribute> CF_POST_INFO =
        ColumnFamily.newColumnFamily("post_info", StringSerializer.get(), postSerializer);

そして、投稿は次のように保存されます。

        MutationBatch m = keyspace().prepareMutationBatch();

    ColumnListMutation<PostAttribute> clm = m.withRow(CF_POST_INFO, "posts")
            .putColumn(PostAttribute.of(post.getId(), "author", "id"), post.getAuthor().getId().get())
            .putColumn(PostAttribute.of(post.getId(), "author", "name"), post.getAuthor().getName())
            .putColumn(PostAttribute.of(post.getId(), "meta", "title"), post.getTitle())
            .putColumn(PostAttribute.of(post.getId(), "meta", "pubDate"), post.getPublishingDate().toDate());

    for(String tag : post.getTags()) {
        clm.putColumn(PostAttribute.of(post.getId(), "tags", tag), (String) null);
    }

    for(String category : post.getCategories()) {
        clm.putColumn(PostAttribute.of(post.getId(), "categories", category), (String)null);
    }

アイデアは、ある時間のバケツのような行を持つことです(たとえば、月または年に1行)。

たとえば、最後の5つの投稿を取得したい場合、どうすればそのための怒りのクエリを実行できますか?投稿ID(UUID)に基づいて怒りのクエリを実行できますが、別のクエリを実行して取得しないと、使用可能な投稿IDがわかりません。ここでのカサンドラのベストプラクティスは何ですか?

もちろん、データモデルに関する提案は大歓迎です。私はcassandraの初心者です。

4

1 に答える 1