如何在Cassandra中为数据建模以避免不必要的重复

时间:2019-04-02 16:06:36

标签: database cassandra nosql data-modeling

我正在设置一个新服务,用于管理一些付款交易。 我有四个用例

  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' ";

一切正常,选择一百万行的时间约为0.5s

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

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

我阅读了有关物化视图的一些内容,但我也阅读了尚未准备就绪的产品。

Link source

谢谢。

1 个答案:

答案 0 :(得分:1)

  

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

您没有做错,您做对了。磁盘空间通常比尝试进行分布式连接要便宜得多。像这样的微小数据。如果有任何问题,我会担心您的单个卡或设备的分区变得太大,因为它的范围是无限的。如果客户每秒设置一件东西来通过设备进行交易该怎么办?一个月或一年后,使用起来会有些困难。