Cassandra CQL3: JSON还是UDT

5

我需要根据IP地址存储有关用户位置的记录,但我不确定最佳建模方式。

对于每个地址,我们需要记录机器的详细信息(IP地址、代理ID)和机器的位置(ISO代码、城市)。这些信息永远不会被更新 - 只能插入和读取。

查询这些数据需要在给定的时间段内检索特定用户的位置信息。

传统上,我会使用宽行CF与JSON blob进行建模,如下所示:

CREATE TABLE user_location (
userid text,
timestamp timeuuid,
data text, -- json blob {agentid, isocode, city, ipaddress}
PRIMARY KEY (userid, timestamp)
);

我现在在质疑这是否是最佳方法,是否应该用用户定义类型(UDT)替换JSON,例如:

CREATE TYPE machinelocation (
isocode text,
city text,
ipaddress inet
);

CREATE TABLE user_location (
userid text,
timestamp timeuuid,
machinelocations map<text, machinelocation>
PRIMARY KEY (userid, timestamp)
);

或者我应该干脆放弃blob,将json分隔成专用列,例如:
CREATE TABLE user_location (
userid text,
timestamp timeuuid,
agentid text,
isocode text,
city text,
ipaddress text,
PRIMARY KEY (userid, timestamp)
);

什么是建模此类数据的推荐方法?
1个回答

2

我建议使用分离的列,除非您确实总是需要检索完整的blob。即使如此,我也可能仍然选择分离的列。UDT的最佳用例是将它们放入集合中,这样您就可以拥有每个项目多个字段的集合。


谢谢您的回复。除了最终的列限制(我不会碰到的),您能想到将它们分开成专用列的任何缺点吗? - beterthanlife
Cassandra在专用列的情况下需要在服务器端进行更多的工作,因此在玩具场景中,这种开销可能会表现为它使用更多的CPU。但是,在任何真实的工作负载下都不应该有影响,并且使您能够做更多的事情而不仅仅是检索整个blob。 - Zanson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接