我正在为我的以下用例设计 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
现在我将从上表中看到的是这样的 -
- 每当我的应用程序第一次运行时,我都会要求提供上表中的所有内容。这意味着给我上表中的所有内容。
- 然后每隔 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
。每当我们将任何新行插入到这个表..因此,对于您的示例(@omnibear),可能有人可以插入相同的 SCHEMA_ID 两次?我说得对吗?
还有关于您作为额外列的type
,在我的示例中,该类型列可以是record_name
..
最佳答案
关于1) Cassandra 用于在多个节点上进行大量写入、大量数据。从这种设置中检索所有数据是大胆的,因为这可能涉及必须由一个客户端处理的大量数据。更好的方法是使用分页。这是natively supported in 2.0 .
关于2) 重点是分区键仅支持 EQ 或 IN 查询。对于 LT 或 GT (>),您可以使用列键。因此,如果按“type”等 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;
更新:
你问:
somebody can insert same SCHEMA_ID twice? Am I correct?
是的,您始终可以使用现有主键进行插入。该主键的值将被更新。因此,为了保持唯一性,主键中经常使用UUID,例如timeuuid。它是一个包含时间戳和客户端 MAC 地址的唯一值。有excellent documentation on this topic .
一般建议:
- 首先写下您的查询,然后设计您的模型。 (用例!)
- 您的查询定义您的数据模型,而数据模型又主要由您的主键定义。
因此,就您而言,我只需调整上面的架构,如下所示:
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
关于java - 如何仅检索从 Cassandra 更改的信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19602979/