如何在Cassandra中建模数据以避免无用的重复

问题描述 投票:1回答:1

我正在建立一项管理一些付款交易的新服务。我有四个用例:

  1. 阅读最近10笔交易。
  2. 阅读当天的最后一笔交易。
  3. 通过卡号读取最近10笔交易
  4. 读取使用特定设备完成的最近10笔交易(例如,设备的ID为“device01”)。

为了达到这个目标,我创建了三个表:

CREATE TABLE test.transaction_by_device (
uid  uuid ,
device text,
time timestamp,
amount double, 
currency text, 
cardNumber text,
PRIMARY KEY ((device),time)
) WITH CLUSTERING ORDER BY (time DESC);


CREATE TABLE test.transaction_by_cardNumber (
uid  uuid ,
device text,
time timestamp,
amount double, 
currency text, 
cardNumber text,  
PRIMARY KEY ((cardNumber),time)
) WITH CLUSTERING ORDER BY (time DESC);

CREATE TABLE test.transaction_by_time (
uid  uuid ,
device text,
year text,
month text,
day text,
time timestamp,
amount double, 
currency text, 
cardNumber text, 
PRIMARY KEY ((year,month,day),time)
) WITH CLUSTERING ORDER BY (time DESC);

我使用的查询是:

const select_last_10_transactions_by_time =
    'SELECT * FROM test.transaction_by_time LIMIT 10';
const select_last_10_transactions_of_the_day_by_time =
    "SELECT * FROM test.transaction_by_time WHERE YEAR='2019' AND MONTH='2' AND DAY='22'";
const select_last_10_transactions_by_cardNumber =
    "SELECT * FROM test.transaction_by_cardNumber where cardNumber='4242800217402773' LIMIT 10";
const select_last_10_transactions_by_device =
    "SELECT * FROM test.transaction_by_device where device='device01' ";

一切都运作良好,选择100万行的时间约为0.5秒

问题是每个表中的每个数据都是重复的。我在这个用例中的数据建模方面做错了什么?

有没有更好的方法来优化这些查询/表?

我读了一些关于物化视图的内容,但我还读到了还没有准备好生产。

Link source

谢谢。

database cassandra nosql data-modeling
1个回答
1
投票

问题是每个表中的每个数据都是重复的。我在这个用例中的数据建模方面做错了什么?

你做错了,你做得对。磁盘空间通常比尝试分布式连接便宜得多。特别是像这样的小数据。如果有任何错误,我会担心你的分区对于单个卡或设备增长太大,因为它基本上没有限制。如果客户设置每秒钟从设备进行交易的事情怎么办?一个月或一年之后,将会有点难以使用。

© www.soinside.com 2019 - 2024. All rights reserved.