如何在 Cassandra 中建模数据以避免无用的重复
How to model data in Cassandra to avoid useless duplication
我正在设置一个新服务来管理一些支付交易。
我有 四个用例:
- 阅读最近 10 笔交易。
- 阅读当天的最后一笔交易。
- 通过卡号读取最近 10 笔交易
- 读取使用特定设备完成的最后 10 笔交易(例如,设备 ID 为 "device01")。
为了实现这个目标,我创建了三个 table:
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' ";
一切正常,select 100 万行的时间约为 0.5 秒
问题是每个数据在每个table中都是重复的。在这个用例中,我在数据建模方面做错了什么?
有没有更好的方法来优化这些queries/tables?
我阅读了一些关于物化视图的内容,但我也阅读了尚未准备好用于生产的内容。
谢谢。
The problem is that every data are duplicated in every table. What I'm doing wrong with the data-modeling in this use cases?
你没有做错,你做对了。磁盘 space 通常比尝试进行分布式连接便宜得多。尤其是像这样的小数据。如果有任何问题,我会担心单张卡或设备的分区变得太大,因为它基本上是无限的。如果客户设置每秒从设备进行交易怎么办?一个月或一年后,工作起来会有点困难。
我正在设置一个新服务来管理一些支付交易。 我有 四个用例:
- 阅读最近 10 笔交易。
- 阅读当天的最后一笔交易。
- 通过卡号读取最近 10 笔交易
- 读取使用特定设备完成的最后 10 笔交易(例如,设备 ID 为 "device01")。
为了实现这个目标,我创建了三个 table:
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' ";
一切正常,select 100 万行的时间约为 0.5 秒
问题是每个数据在每个table中都是重复的。在这个用例中,我在数据建模方面做错了什么?
有没有更好的方法来优化这些queries/tables?
我阅读了一些关于物化视图的内容,但我也阅读了尚未准备好用于生产的内容。
谢谢。
The problem is that every data are duplicated in every table. What I'm doing wrong with the data-modeling in this use cases?
你没有做错,你做对了。磁盘 space 通常比尝试进行分布式连接便宜得多。尤其是像这样的小数据。如果有任何问题,我会担心单张卡或设备的分区变得太大,因为它基本上是无限的。如果客户设置每秒从设备进行交易怎么办?一个月或一年后,工作起来会有点困难。