私は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の初心者です。