如何为cassandra上的许多记录重复信息建模

时间:2016-05-31 18:21:46

标签: cassandra modeling nosql

我有一张包含数千亿条记录的大型表格,我的意思是在此表格中添加一个字段,其中将为数百万条记录重复相同的值。我不知道如何在cassandra中有效地建模。请允许我详细说明:

我有一个通用表格:

File/settings/Editor/Colors & Fonts/Language Defaults

此表包含700.000.000+条记录。 我想在此表中创建一个名为CREATE TABLE readings ( key int, key2 int, time timestamp, name text, PRIMARY KEY ((key, key2) time) ) 的字段。此字段指示记录的来源(因为软件有多种方式在source表上接收信息)。此字段的一个可能值是reading"XML: path\to\file.xml"或甚至"Direct import from the X database",我希望这是一个描述性字段,专门用于以后我们只想操作的数据库中的维护来自特定来源的记录。

我想要运行的查询现在无法完成:

  • "Manually added"表上的哪些记录来自某个来源?
  • 给定记录的来源是什么?

我可以创建一个解决方案,例如:

readings

这将允许我执行第一个查询,但也意味着我将使用大量信息在我的数据库上创建700.000.000+个新记录,这将占用大量不必要的存储空间,因为数千万这些记录对CREATE TABLE readings_per_source( source text, key int, key2 int, time timestamp, PRIMARY KEY (source, key, key2, time) ) 具有相同的值。

如果这是一个关系环境,我会在source表格上创建一个source_id字段,并在readings表格中创建sourceid (PK)字段,这意味着只为name表中的每一行存储一个额外的整数,以及一个包含不同来源的记录的新表。

如何在cassandra中对此进行建模?

2 个答案:

答案 0 :(得分:2)

您的架构

CREATE TABLE readings_per_source(
    source text,
    key int,
    key2 int,
    time timestamp,
    PRIMARY KEY (source, key, key2, time)
)

是一个非常糟糕的主意,因为source是分区键,您可以拥有数百万条共享相同源的记录,例如具有非常宽的分区 - > 热点

对于第二个查询,如果使用记录主键(key,key2)访问数据,What is the source of a given record?是非常简单的。 source列可以作为常规列添加到表

对于第一个查询Which records on the readings table were gotten from a given source?,它更棘手。这里的想法是获取具有相同源的所有记录。

您是否意识到此查询可能会返回数千万条记录

如果这是你想要做的,有一个解决方案,使用新的SASI二级索引(阅读我的blog post了解所有细节)并在source列上创建一个索引

CREATE TABLE readings (
    key int,
    key2 int,
    time timestamp,
    name text,
    source text,
    PRIMARY KEY ((key, key2), time)
)

CREATE CUSTOM INDEX source_idx ON readings(source) 
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {
     'mode': 'PREFIX', 
     'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer',
     'case_sensitive': 'false'
};

然后要获取具有相同源的所有记录,请使用Java驱动程序(或任何其他Datastax驱动程序)的 server-side paging 功能

答案 1 :(得分:1)

http://www.datastax.com/2015/03/how-to-do-joins-in-apache-cassandra-and-datastax-enterprise是关于如何在Cassandra中加入表格的非常好的文章。

规范化数据总是比非规范化(平面)数据占用更少的存储空间(假设相关数据大于用于将表连接在一起的密钥),但需要在查询期间需要更多马力才能计算的连接。 / p>

总是需要权衡利弊。还有一个关于具有完全标准化数据的状态的权衡,一个例子是改变地址的客户。在完全标准化的模式中,一旦进行地址更改,客户的所有发票(过去和现在)都会显示新地址。这并不总是令人满意的。

通常需要部分规范化以在记录上提供历史状态,其中在给定时间(例如在发票上)显示数据状态是重要的。在这种情况下,您可以在创建发票时在发票上存储客户地址数据的副本。

这对定价和税收尤其重要。您希望将价格/税金与发票一起存储,以便您可以显示客户在创建发票时支付的金额,因此当会计按月,按年度和超出数量运行时,给定发票上的价格对于日期上的日期是正确的。发票,即使产品价格可能已经改变。否则你会有一场会计噩梦!

在决定如何规范化/反规范化模式时,还需要考虑更多的内容。

抱歉漫无目的......