我是cassandra的新手,在以下场景的数据建模中需要帮助。 在oracle中,我有两个类似于下面的表,我正在考虑迁移到cassandra。
要解决的用例: 1.重读和写。 2.首先创建用户数据,我们可以继续向其中添加或删除帐户。 3.还将对用户帐户之一进行部分更新,例如更新帐户的金额或某些详细信息。 4. User_data有一个字段,用于存储当前活动的user_accounts的计数。因此,无论何时我们在user_account表中添加或删除条目/行。它将触发user_data中的更新。
基本上我不清楚如何为这些场景建模。是否有一张桌子。但是与此有关,我不确定帐户数 如果我有单个表,并且将user_accounts作为类型为json的列之一。然后,我相信我无法在该json中进行部分更新。
考虑两个表的主要问题是事务管理。 如果我能够添加到user_account,但无法更新user_data,则将是失败的。
创建表USER_DATA( userId uuid主键, 名称varchar, noOfAccounts int,
.....#更多列...,
);
创建表USER_ACCOUNTS(
userId uuid
accountId uuid,
amt int,
.....#更多列...,
主键(uuid,accountId) );
我尝试使用FROZEN USER_ACCOUNTS列表,但与此同时,我们需要读取整个列表,并在每次添加/删除或更新其中一个条目时写回。
我尝试使用json类型,但没有用。
答案 0 :(得分:1)
在继续操作之前,让我先强调一个重要点:您确定需要NoSQL和确切的Cassandra来存储用户和帐户吗?
Cassandra专为大型分布式数据而设计,并针对非常快速的写入进行了优化。如果您仍在考虑选择解决方案,我建议您花一些时间来调查现有解决方案以及它们是否有效的案例。互联网上有很多文章。例如。 https://www.infoworld.com/article/3268871/how-to-choose-the-right-type-of-database-for-your-enterprise.html
卡桑德拉。
选择结构之前的重要问题:
强烈建议为所有用例编写性能测试,并在做出任何决定之前检查性能。
最初的存储结构可以开始进行性能测试,但有一些改进:
create table users.user_data (user_id uuid PRIMARY KEY,
name varchar,
account_count counter,
some_other_column varchar);
create table users.user_account (user_id uuid account_id uuid , amt int,
PRIMARY KEY (user_id, account_id));
如果我们为用户添加新帐户或删除现有帐户,我们应该进行影响多个表的交易。
可能出现的最明显的事情是多分区批次,但这慢。仔细阅读:Doc
建议尝试使用驱动程序代码异步写入。为您的编程语言选择Cassandra DataStax驱动程序。这是一个基于Java代码的抽象示例,用于理解该想法:
session.executeAsync("insert into users.user_account ...");
Futures.addCallback(future,
new FutureCallback<ResultSet>() {
@Override public void onSuccess(ResultSet result) {
// Run query for incrementing counter in users.user_data table
}
@Override public void onFailure(Throwable t) {}
},
MoreExecutors.sameThreadExecutor() );
更新(2019年5月14日):
可使用的替代解决方案:单表和静态列看看https://blog.ippon.tech/modeling-data-with-cassandra-what-cql-hides-away-from-you/
似乎静态列可以帮助您!
create table users.user_data (user_id uuid PRIMARY KEY,
name varchar static,
account_count counter static,
some_other_column varchar static,
account_id uuid,
amt int,
PRIMARY KEY (user_id, account_id));