【问题标题】:How is denormalization handled in cassandra在 cassandra 中如何处理非规范化
【发布时间】:2017-04-01 19:33:01
【问题描述】:

用重复数据更新表的最佳方法是什么?

我有一张桌子

table users (
id text PRIMARY KEY,
email text,
description,
salary
)

我将对这张表进行删除、更新、插入等操作。但我还要求能够通过电子邮件和描述进行搜索。如果我使用新的电子邮件复合键和描述创建新表,

当我更新我的基表时,我会这样做

insert into users (id, salary) values (1, 500);

我没有更新我的辅助表所需的数据,因为客户只有 id 和薪水。第二个表是如何更新的。

其他解决方法和缺点

  1. 我本可以创建一个物化视图,但由于基表只有一个主键,我只能再添加一列。我的搜索要求需要不止一列。
  2. 在要搜索的列上创建二级索引。但是这样做的性能会很差,因为我将要搜索的列的基数很高。即描述、电子邮件等

【问题讨论】:

    标签: cassandra data-modeling denormalization nosql


    【解决方案1】:

    因此,“正确”的做法是创建 3 个表。 sale_by_id、salary_by_email 和salary_by_description。

    table salary_by_id (
      id text PRIMARY KEY,
      salary int
    )
    
    table salary_by_email (
      email text PRIMARY KEY,
      salary int
    )
    
    table salary_by_description (
      description text,
      id int,
      salary int,
      primary key (description, id)
    )
    

    我将id添加到salary_by_description的原因是,根据我自己的猜测,description不会是全局唯一的,所以它的主键中必须有其他内容。

    根据这些表的大小,最后一个可能需要在其分区键中添加一些额外的东西。如果需要,您可以将 id、电子邮件和描述添加到其他表中。

    现在,在插入或删除您需要的值时,请在所有 3 个表中执行此操作。如果您使用支持异步调用的驱动程序(如 java 中的驱动程序),那么这不会花费太多额外费用。

    【讨论】:

    • 但是对于我插入salary_by_id(1, 500) 的场景,如果我没有与此相对应的电子邮件,我该如何插入第二张表?
    • 您需要先获取它。如果你还没有它在某个地方。
    • @AndreasWederbrand 您如何确保所有 3 次薪水更新都会成功?如果 3 个查询中只有 2 个成功,会发生什么情况?会不会是一张表的状态不一致?
    • 为什么写入会失败?您基本上必须在两次写入或写入错误查询之间终止 Cassandra 节点。请记住,Cassandra 从不拒绝写入。没有可以超时的唯一索引或锁。
    • @AndreasWederbrand “Cassandra 从不拒绝写入”——这不是真的。来自文档:"Apache Cassandra will discard mutations larger than a predetermined size." C* 将丢弃大于 commit_log_segment_size_in_mb 大小 50% 的写入(在上述用例中,不太可能超出默认限制——除非描述字段可能是大小。但是,值得澄清的是,写入可以被拒绝。)
    猜你喜欢
    • 2016-05-13
    • 1970-01-01
    • 2014-05-19
    • 2016-05-27
    • 2018-07-31
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    相关资源
    最近更新 更多