【问题标题】:Cassandra CQL3: JSON or UDTCassandra CQL3:JSON 或 UDT
【发布时间】:2015-11-24 04:23:01
【问题描述】:

我需要根据 IP 地址存储有关用户位置的记录,但我不确定如何最好地对其进行建模。

对于每个地址,我们需要记录机器的详细信息(ipaddress、agentId)和机器的位置(isocode、city)。此信息永远不会更新 - 只会插入和读取。

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

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

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

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

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 分成专用列,ala:

CREATE TABLE user_location (
userid text,
timestamp timeuuid,
agentid text,
isocode text,
city text,
ipaddress text,
PRIMARY KEY (userid, timestamp)
);

对这种类型的数据建模的推荐方法是什么?

【问题讨论】:

    标签: json cassandra cql3 user-defined-types


    【解决方案1】:

    我会使用单独的列,除非您真的总是会拉满整个 blob。即使那样,我可能仍然会使用单独的列。我看到的 UDT 的最佳用例是能够将它们放入集合中,这样您就可以拥有每个项目包含多个字段的集合。

    【讨论】:

    • 感谢您的回复。除了最终的列限制(无论如何我都不会达到)之外,您能想到将它们分成专用列的任何缺点吗?
    • Cassandra 将不得不在专用列的情况下在服务器端做更多的工作,所以在一个玩具场景中,开销可能会显示为它使用更多的 cpu。但它不应该对任何实际工作负载产生影响,并且让您能够做的不仅仅是检索整个 blob。
    猜你喜欢
    • 2015-11-09
    • 2013-11-03
    • 2013-08-09
    • 2018-08-23
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2023-03-31
    • 2015-09-01
    相关资源
    最近更新 更多