重读写的cassandra数据建模方法

nom7f22z  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(286)

我是新来Cassandra和需要帮助的数据建模下面的情况。在oracle中,我有两个类似于下面的表,我正在考虑迁移到cassandra。
要解决的用例:1。繁重的读写。2用户数据是先创建的,我们可以不断向其中添加或删除帐户。三。也将有一个用户帐户的部分更新,如更新金额或帐户的一些细节。4用户数据有一个字段来存储当前活动用户帐户的计数。因此,每当我们在user\ u account表中添加或删除条目/行时。它将触发用户数据的更新。
基本上我不清楚如何模拟这些场景。是否只有一张table。但这样一来,如果我有一个表,并且将user\u accounts作为json类型的列之一,我就不能确定帐户的数量。然后,我相信我不能在json中对其进行部分更新。
两表思想中的主要问题是事务管理。如果我能够添加到用户\帐户,但无法更新用户\数据,那么这将是一个失败。
创建表用户数据(userid uuid主键,name varchar,noofaccounts int,
..... #更多栏。。。,
);
创建表用户帐户(userid uuid accountid uuid,
金额积分#更多栏。。。,
主键(uuid,accountid));
我试着使用冻结用户帐户的列表,但是我们需要读取整个列表,并在每次添加/删除或更新其中一个条目时进行写回。
我尝试使用json类型,但没有用。

bakd9h0s

bakd9h0s1#

在继续之前让我强调一点:您确定需要nosql和exact cassandra来存储用户和帐户吗?
cassandra是为大规模分布式数据而设计的,它针对非常快速的写入进行了优化。如果您仍在考虑选择解决方案,我建议您投入一些时间调查现有的解决方案,以及有效/无效的案例。网上有很多文章。例如。https://www.infoworld.com/article/3268871/how-to-choose-the-right-type-of-database-for-your-enterprise.html
Cassandra。
选择结构前的重要问题:
用户添加新帐户和删除现有帐户的频率是多少?
有多少用户同时进行?
典型用户有多少个帐户?
强烈建议为所有用例编写性能测试,并在做出任何决定之前检查性能。
最初的存储结构可以开始进行性能测试,但改进很少:

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));

用户类型。用户\数据。帐户\计数字段是计数器
这两个表都存储在keyspace用户中。键空间配置对性能很重要。
当我们为用户添加新帐户或删除已有帐户时,我们应该使事务影响多个表。
也许最明显的是多分区批处理,但这是缓慢的。仔细阅读:博士
建议尝试使用驱动程序代码进行异步写入。为您的编程语言选择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));

原来不属于用户帐户表的列被标记为静态列
静态列只在内部存储一次
user\u id是分区密钥,account\u id是集群密钥。解释
计数器列可能是静态的,根据此类型的计数器表定义是否有效?

相关问题