在Cassandra数据建模方面寻求帮助。
我在这里拿一些假的例子。说我有设备,我收集设备的数据。现在我有一些问题 1.选择设备状态=“已发布”的设备数据; 状态可以“发布”或“未发布”
现在,如果我想创建列族以满足上述查询,那么我可以执行以下操作
CREATE TABLE devices (
device_id text,
device_name text,
status text,
enabled boolean,
.
.
.
.
.
other device information,
PRIMARY KEY (status, enabled, device_id))
现在我的问题是
我可以像这样创建一个列族吗?如果是的话,是否存在任何潜在的问题。
设备的状态和启用值可能会发生变化,因此它会创建新行,因为主键会有所不同吗?如果它插入新行,那么如何删除旧记录?如果通过保留所有其他设备信息不能删除旧记录,如何引用新记录?
答案 0 :(得分:1)
我可以像这样创建一个列族吗?如果是的话,有没有 这方面的潜在问题。
不...虽然你可以创建这样的表,但cassandra不会限制我建议不要。
表格设计有一个大问题,那就是数据分发。由于状态仅发布和未发布,因此将只创建2行。 这最终将导致宽行,这将降低性能。
CQL to Internal data structure
设备的状态和启用值可能会发生变化,因此也是如此 创建新行因为主键会有所不同吗?如果它 插入新行然后如何删除旧记录?如何参考 如果旧记录不能通过保留所有其他记录而删除,则为新记录 设备信息相同吗?
基于某个特定设备的上述信息,只能有4个distict值(status =已发布,enabled = true / false)和(status =已发布enabled = true / false),尽管它不是行...它是cql中的单元格。删除cassandra中的记录将创建逻辑删除,如果您经常更改状态并且您正在删除记录,那么它将创建许多逻辑删除,然后您将不得不运行频繁的压缩,否则查询将开始失败。
我建议使用一些主键。
答案 1 :(得分:0)
正如@undefined_variable所提到的,这种表将导致集群上的热点。实际上,您的整个数据最多只能在两个节点(以及副本)中收集。您可能想要问自己的第一个问题是,有多少设备,并且执行上述查询,确实有意义。如果你有100000个设备,你真的会一次读取100000行吗?不会有更多的过滤器。基于此,您需要决定如何对此进行建模。