我现在正在学习Cassandra,我明白我应该为每个查询创建一个表。我不确定何时应该制作单独的表格或物化视图。例如,我对用户和帖子有以下查询:
/Errors/NotFound
users_by_id
users_by_email
users_by_session_key
我应该始终使用物化视图吗?
在我看来,如果你想让帖子或用户在查询中保持一致,那么我必须使用物化视图。但我读到的物化视图的延迟时间为posts_by_id
posts_by_category
posts_by_user
。
另一方面,如果我使用不同的表,我是否应该在每次创建新帖子时进行3次插入?我注意到我收到错误read before write
,这意味着我必须一次一个地插入到每个单独的表中,如果其中一个查询失败,这可能会导致一致性问题。 (如果其中一个失败,批处理语句将全部失败)。
所以,既然保持一致性是有意义的,那么在我看来,我总是想要使用物化视图,并且必须采取batch with conditions cannot span multiple tables
惩罚。
我想我的另一个问题是什么时候数据不一致会好吗?
所以希望有人可以为我提供更清晰的信息,告诉他如何在像用户或帖子这样的理论模型中处理cassandra中的多个查询。我应该使用物化视图吗?如果我为每个模型使用3个不同的表,我该如何保持它们的一致性?只是希望所有3个插件都不会失败?似乎不对。
答案 0 :(得分:2)
阅读我的深度博客文章,了解使用物化视图时的所有权衡。一旦您理解了权衡,请明智地选择:http://www.doanduyhai.com/blog/?p=1930
答案 1 :(得分:0)
不,您不应该总是使用物化视图。完美的解决方案是数据库的接口。在此应用程序中,您可以处理所有不同的表。但是物化视图也有一些用例:如果您没有时间使用此应用程序但需要此功能,请使用物化视图。您有性能权衡,但在这种情况下,时间更重要。如果您还需要真正的更新而不是所有表上的upsert:使用物化视图。
Batch对于缓冲或将具有相同分区键的数据集放在一起非常有用。例如:您有一个高数据吞吐量应用程序。在您的心跳之间或在使用QUORUM执行另一个查询之间,您使用相同的分区键获得了10个其他事件。但是你不会执行它们,因为你正在等待成功的响应。如果成功返回,则执行批处理查询。但请记住:只使用批处理相同的分区键。
一般来说,记住一件重要的事情:Cassandra最终具有一致性模型。这意味着:如果你使用qourum,你会有一致性,但不是每次都有。如果您的应用程序需要完全一致性,不仅最终使用其他解决方案。例如。带分片的SQL。 Cassandra针对写入进行了优化,只有在使用cassandra功能时才会感到高兴。
一些性能提示: 如果您需要更好的一致性:使用QUORUM,永远不要使用ALL。而且,通常,独立编写查询。有时批处理很有用。不要使用ALLOW FILTERING执行查询。不要在分区键上使用令牌范围或IN运算符:)