2012-03-13 72 views
2

请原谅我提出可能在其他地方解释过的问题,但我在Cassandra中设计数据模型时遇到问题。Cassandra数据模型方法

我正在存储交易。这些交易都有一个源(用户),一个时间戳和一些关联的关键字。我需要能够找到源和日期范围以及(可选)关键字的交易。 Cassandra很有吸引力,因为我需要存储数十亿笔交易。

我一直无法找到解释如何做这种事情的资源。我最初的想法涉及有几个CF - 一个事务CF,一个keyword_transaction CF,一个source_transaction CF,以及可能的day_transaction CF(或类似的东西)。这可以使得基于上述任何一项查找交易变得非常简单,但似乎并不能让我搜索所有上述项目。

有什么想法?

回答

3

首先考虑您的查询,然后再考虑您的数据模型。阅读herehere,因为这有助于您规划数据模型。

cf : transactions 
rowkey : source/uuid (suggestion) 
    cn : source 
    cv : UTF8 
    cn : keyword 
    cv : UTF8 
    cn : date 
    cv : DateType 
    cn : time 
    cv : DateType 


cf : keywords 
rowkey : keyword 
    cn : source 
    cv : UTF8 

那里你将有一个标准列族称为交易和几列名(CN)和其相应的列值(CV)。这些交易中的每一个都由rowkey标识。另一个标准列家族是关键字rowkey将成为关键字。

您可以通过来源,时间戳或关键字进行搜索,但是您确实需要index才能使查询生效。例如上述建议的数据结构,你可以做这些:

  • 获得所有交易,其中源等于“”
     
        get transactions where source = '' 
    
  • 获得所有交易,其中源等于“”和你的约会>“ “
     
        get transactions where source = '' and date > ''; 
    
  • 获取日期的所有交易X
     
        get transactions where date = ''; 
    
  • 获得基于关键字的所有源名称
     
        get keywords['keyword']; 
    
+0

我来这里问了一个类似的问题,我也已经达到了这个解决方案,但由于偶尔引用了“热点”,我可能不满意它,因为您可能会从一个“源”中收到大量数据'并且因为它是分区键,所有数据都将转到单个节点。我一直在想这是否是可以避免的,同时又不会失去像“source ='foo'和time> t0和time 2014-06-03 17:00:03

+0

OP提出的这个问题很早以前就发生过,甚至以上的cassandra-cli也不赞成这一刻。喜欢的方法将通过cqlsh使用。话虽如此,我不知道你是如何得到热点的印象,如果你想要数据存储到不同的服务器,请尝试改变一些关键,例如, key1 || foo,key1 || bar所以哈希这将是不同的,并存储在不同的服务器?但是我们有每个节点负载大约300-400GB稳定的生产数据..热点?除非你现在提到,否则我甚至没有注意到它,也没有打扰它。 – Jasonw 2014-06-03 17:09:34

+0

我刚才提到了cqlsh,所以你应该检查出cql spec 3.0以及此前的版本,cassandra版本1.2和2.0以后版本可以大大提高对cql的支持。尝试阅读http://cassandra.apache.org/doc/cql3/CQL.html和http://www.datastax.com/dev/blog/lightweight-transactions-in-cassandra-2-0。我不知道你确切的问题是,但我希望你根据我的意见得到想法,你可以继续前进。 – Jasonw 2014-06-03 17:11:46