在Cassandra中存储原始类型与对象类型

时间:2012-02-29 20:38:58

标签: nosql cassandra

在Cassandra中存储完整的序列化对象与在对象中仅存储更原始的类型作为列有什么优点和缺点?

在我看来,如果您将整个对象存储在一列中,则会失去灵活性,但会变得简单。如果存储了一个完整的对象并且你想在其中一个成员上编入索引,那么就不可能在列上使用本地Cassandra二级索引吗? (虽然我在这里假设您将使用该成员值作为行键创建自己的索引,并使用其他列族)

感谢您提供的任何信息。我仍然以这种格式围绕架构设置包围我的大脑。

1 个答案:

答案 0 :(得分:2)

完整对象序列化的优点和缺点似乎都非常明显:

  • 在磁盘和传输数据时更紧凑的表示
  • 能够使用支持模式演变的工具,例如Thrift或ProtoBuf

缺点:

  • 此处不能使用Cassandra本机索引(cassandra本机索引与数据一起分区,因此无法使用其他列族进行模拟)
  • 无法使用CLI等常用工具查询对象的各个字段
  • 修改对象的单个字段需要加载并保存完整记录
  • 修改架构需要加载和处理完整数据集(例如,无法删除列)。

因此,例如,在存储页面视图事件时使用完整对象序列化是个好主意 - 紧凑性可以节省大量磁盘空间,并且这些事件在写入后永远不会被修改。即使模式发生了变化(即添加了新字段),也无需触摸旧数据,只需以新格式编写新事件,并使用ProtoBuf正确读取旧记录和新记录。

另一方面,在存储诸如“带标题和标签的图片”之类的对象时使用它是一个坏主意 - 具有大量二进制数据和小的可变字段的东西。