用于大量读写的cassandra数据建模方法

时间:2019-05-03 14:57:00

标签: cassandra

我是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类型,但没有用。

1 个答案:

答案 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));
  • users.user_data.account_count字段的类型为counter
  • 两者 表存储在keyspace个用户中。密钥空间配置对于性能至关重要。

如果我们为用户添加新帐户或删除现有帐户,我们应该进行影响多个表的交易。

可能出现的最明显的事情是多分区批次,但这。仔细阅读: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));
    标记
  • 最初不属于 user_account 表的列 为 static
  • 静态列仅在内部存储一次
  • user_id是分区键,而account_id是集群键Explanation

根据Is this type of counter table definition valid?

,“计数器”列可能是静态的