我是Cassandra的新手,我一直在阅读并尽力进行实验。
我遇到过文档说你可以为每个查询创建1个表,如果你愿意的话。因此,如果我有一个“客户”记录,其中有4个不同的字段需要查询,那么我可以创建4个不同的表来执行此操作。
然后我遇到了一个名为“批处理”的功能,似乎说如果我将它们批量放入,我可以在事务上进行4次更新。
但是我在文档中找不到任何清楚的东西,将所有部分组合在一起并说“你应该为每个查询创建1个表,并且你应该使用批处理来保持所有这些查询表同步。这是最好的做法。“
这是最佳做法吗?对于一个新手来说,我可以做的少一点“CAN”和一点“应该”:)
答案 0 :(得分:4)
您是否考虑过使用物化视图?这是Cassandra 3.0中的一个新功能,可以很好地满足您的用例,您可以拥有一个基表,然后为每个查询创建一个关闭该表的视图。例如,以this blog post为例:
CREATE TABLE users (
id uuid PRIMARY KEY,
username text,
email text,
age int
);
CREATE MATERIALIZED VIEW users_by_name AS
SELECT * FROM users
WHERE username IS NOT NULL
PRIMARY KEY (username, id);
将数据插入用户时,数据也会传播到视图。但是,它并不完全是事务性的(获得成功的写入响应并不意味着它已经传播到视图中,但它们最终会被传播),但它可能会减轻客户端的负担,应该处理有关表/视图同步的任何问题。
答案 1 :(得分:2)
您不应该使用批处理。有两个重要原因:
更好:将所有内容拆分为不同的查询。如果需要在所有节点上成功查询,请使用ALL或QUORUM的一致性级别。更多信息:https://docs.datastax.com/en/cql/3.3/cql/cql_reference/consistency_r.html
您可以在此处阅读有关此功能的更多信息。批处理的工作原理:https://inoio.de/blog/2016/01/13/cassandra-to-batch-or-not-to-batch/
但是批处理有一个用例:如果你已经发送了一些具有相同分区键的插入查询,并且这些查询仍在进行中,请缓冲下一个查询并作为批处理执行它,如果你有一个成功的响应以前的查询。这样,您可以防止数据库负载过高。
编辑: 我忘记了一件事:你写了关于创建语句的文章。我认为既不是批处理也不是ALL / QOURUM对于创建语句都很重要。通常,您不会动态创建表并同时向此表插入新行。通常:您在开发环境中创建一个新表,更改您的应用程序,并在测试后在生产环境中创建一个新表。一段时间后,您正在部署新版本的应用程序。在这段时间内,您可以确保在每个节点上创建新表。一些框架提供了这种动态创建表的方法,但我认为最好手动控制它。使用代码执行此操作太危险了。也许有人拼错了一张桌子或类似的东西。