卡桑德拉建模模式

时间:2016-05-24 14:57:05

标签: cassandra data-modeling

我是Cassandra的新手,我一直在阅读并尽力进行实验。

我遇到过文档说你可以为每个查询创建1个表,如果你愿意的话。因此,如果我有一个“客户”记录,其中有4个不同的字段需要查询,那么我可以创建4个不同的表来执行此操作。

然后我遇到了一个名为“批处理”的功能,似乎说如果我将它们批量放入,我可以在事务上进行4次更新。

但是我在文档中找不到任何清楚的东西,将所有部分组合在一起并说“你应该为每个查询创建1个表,并且你应该使用批处理来保持所有这些查询表同步。这是最好的做法。“

这是最佳做法吗?对于一个新手来说,我可以做的少一点“CAN”和一点“应该”:)

2 个答案:

答案 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对于创建语句都很重要。通常,您不会动态创建表并同时向此表插入新行。通常:您在开发环境中创建一个新表,更改您的应用程序,并在测试后在生产环境中创建一个新表。一段时间后,您正在部署新版本的应用程序。在这段时间内,您可以确保在每个节点上创建新表。一些框架提供了这种动态创建表的方法,但我认为最好手动控制它。使用代码执行此操作太危险了。也许有人拼错了一张桌子或类似的东西。