【问题标题】:How to retrieve only the information that got changed from Cassandra?如何仅检索从 Cassandra 更改的信息?
【发布时间】:2013-11-05 08:20:01
【问题描述】:

我正在为以下用例设计 Cassandra 列族架构。我不确定为以下用例设计 cassandra 列族的最佳方法是什么?我将为此使用 CQL Datastax Java 驱动程序..

下面是我的用例和我现在设计的示例模式 -

SCHEMA_ID       RECORD_NAME               SCHEMA_VALUE              TIMESTAMP
1                  ABC                     some value                 t1
2                  ABC                     some_other_value           t2
3                  DEF                     some value again           t3
4                  DEF                     some other value           t4
5                  GHI                     some new value             t5
6                  IOP                     some values again          t6

现在我将从上表中看到的是这样的 -

  1. 每当我的应用程序第一次运行时,我都会要求上表中的所有内容..意思是给我上表中的所有内容..
  2. 然后每隔 5 或 10 分钟,我的后台线程将检查此表,并要求只提供已更改的所有内容(如果该行有任何更改,则为整行)。这就是我使用的原因时间戳作为此处的列之一..

但我不确定如何设计查询模式,以便我的两个用例都能轻松满足,为此设计表的正确方法是什么?这里 SCHEMA_ID 将是我想使用的主键...

我将为此使用 CQL 和 Datastax Java 驱动程序..

更新:-

如果我使用这样的东西,那么这种方法有什么问题吗?

CREATE TABLE TEST (SCHEMA_ID TEXT, RECORD_NAME TEXT, SCHEMA_VALUE TEXT, LAST_MODIFIED_DATE TIMESTAMP, PRIMARY KEY (ID));

INSERT INTO TEST (SCHEMA_ID, RECORD_NAME, SCHEMA_VALUE, LAST_MODIFIED_DATE) VALUES ('1', 't26',  'SOME_VALUE', 1382655211694);

因为,在我的这个用例中,我不希望任何人每次都插入相同的SCHEMA_ID。SCHEMA_ID 应该是唯一的,只要我们在此表中插入任何新行。所以在你的例子中(@ Omnibear),有可能有人可以插入相同的 SCHEMA_ID 两次?我说的对吗?

关于type,您已将其作为额外列,在我的示例中,该类型列可以是record_name..

【问题讨论】:

  • 突然想到:没有必要用 1 个表满足所有用例。 NoSQL 存储的原则之一是在有意义的时候采用冗余。您在分布式环境中工作,因此存储成本不高。如果您可以通过创建两个而不是一个表来解决问题 - 就这样做:-)
  • 感谢 omnibear 的建议。但我想,我可以用我当前的表架构来实现我的第二个问题答案?正确的?如果是,那我该怎么做?有什么想法吗?

标签: java cassandra cql datastax-java-driver


【解决方案1】:

关于 1) Cassandra 用于大量写入,多个节点上的大量数据。从这种设置中检索所有数据是大胆的,因为这可能涉及必须由一个客户处理的大量数据。更好的方法是使用分页。这是natively supported in 2.0。

关于 2) 关键是分区键只支持 EQ 或 IN 查询。对于 LT 或 GT (),您使用列键。因此,如果按“类型”之类的 ID 对条目进行分组有意义,则可以将其用作分区键,并将 timeuuid 用作列键。这允许像这样查询所有比 X 新的条目

create table test 
  (type int, SCHEMA_ID int, RECORD_NAME text, 
  SCHEMA_VALUE text, TIMESTAMP timeuuid, 
  primary key (type, timestamp));

select * from test where type IN (0,1,2,3) and timestamp < 58e0a7d7-eebc-11d8-9669-0800200c9a66;

更新:

你问:

有人可以插入相同的 SCHEMA_ID 两次吗?我说的对吗?

是的,您始终可以使用现有主键进行插入。该主键的值将被更新。因此,为了保持唯一性,主键中经常使用 UUID,例如 timeuuid。它是一个包含时间戳和客户端 MAC 地址的唯一值。有excellent documentation on this topic。

一般建议:

  1. 首先写下您的查询,然后设计您的模型。 (用例!)
  2. 您的查询定义了您的数据模型,而该模型又主要由您的主键定义。

所以,在你的情况下,我只需调整上面的架构,如下所示:

CREATE TABLE TEST (SCHEMA_ID TEXT, RECORD_NAME TEXT, SCHEMA_VALUE TEXT,   
LAST_MODIFIED_DATE TIMEUUID, PRIMARY KEY (RECORD_NAME, LAST_MODIFIED_DATE));

允许这个查询:

select * from test where RECORD_NAME IN ("componentA","componentB")
  and LAST_MODIFIED_DATE < 1688f180-4141-11e3-aa6e-0800200c9a66;

the uuid corresponds to -> Wednesday, October 30, 2013 8:55:55 AM GMT
so you would fetch everything after that

【讨论】:

  • 非常感谢 Omnibear 的建议.. 现在说得通了.. 但我对这种方法有一个问题.. 我已经更新了我的困惑与我的问题..
猜你喜欢
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 2015-01-25
  • 2011-12-10
  • 2017-08-15
  • 1970-01-01
相关资源
最近更新 更多