【发布时间】:2016-07-06 12:24:34
【问题描述】:
例如,假设我想存储书籍以及它们在哪些图书馆中。我可以制作这样的表格:
create table book (
id uuid,
created timestamp,
title text,
library_id uuid,
primary key (id)
);
如果我想获取给定图书馆中所有书籍的列表,我可以制作如下的物化视图:
create materialized view book_per_library as
select *
from book
where library_id is not null
and id is not null
primary key (library_id, id);
我认为该架构存在一些问题,我不确定如何解决这些问题。
问题1.一个节点的书太多,查询慢
为了使这个示例与我实际使用的数据等效,我可能在一个图书馆中拥有数十亿本书。如果我的分区键是 library_id(在表或物化视图中),我会最大化可以存储在具有该分区键的节点上的内容。我发现的一种可能的解决方案是根据创建的时间戳对数据进行分区,如下所示:
create table book (
id uuid,
created timestamp,
title text,
library_id uuid,
date text,
primary key (id, library_id)
);
create materialized view book_per_library as
select *
from book
where library_id is not null
and date is not null
and id is not null
primary key ((library_id, date), id);
这是基于诸如https://academy.datastax.com/demos/getting-started-time-series-data-modeling 之类的读数,其中日期列类似于“2013-04-03”。然后我必须每天运行一个单独的查询。对于我的实际数据,我什至可能需要将其拆分为每小时,以便仍然允许单个节点存储所有数据。我的数据可以在短时间内(例如一小时)以非常大的爆发(例如数百万)添加。或者我的数据可以每隔一段时间逐个添加(例如一次一个或几个)。因此,它不是一个恒定的数据流。
无论如何,这里的查询不会是一个缓慢的过程吗?我可能不得不运行数千个查询来涵盖多年的跨度,只是为了获得那个图书馆中的书籍列表。另外,我怎么知道哪些日期实际有数据?
我想我基本上是想找到一种方法来避免必须使用类似 spark 的东西来阅读整个书桌,因为我不想阅读所有图书馆的行,只是我关心的那个。我还试图找到一种方法来避免对没有任何数据的日期运行查询,因为这似乎是在浪费时间。一个想法是找到一种方法让 cassandra 跟踪每个库的哪些日期有数据,这样我就知道要查询哪些分区键。也许有一个计数器表,我在其中存储每个日期值的书籍计数,例如“2013-04-03”。读取给定库的所有这些计数将是一个两步过程,然后仅对计数 > 0 的日期运行主查询。这是一个可行的解决方案吗?有更好的选择吗?
问题 2. 我必须能够将书籍移动到不同的图书馆,即我必须能够更改 library_id
作为一项要求,我必须能够将书籍移动到不同的图书馆。据我了解,这意味着我不能将 library_id 作为分区键列或集群列。如果我这样做了,那么将这本书“移动”到另一个图书馆需要我从当前图书馆删除它,然后将新记录添加到新图书馆。那准确吗?是否有更好的方法可以将表中的行与组相关联,同时也提供更改该分组的能力?
总体问题
在这种情况下,我想获取与某个“组 ID”(如 library_id)相关联的表的所有行,并且每个组可能有数十亿个行,我需要能够改变这种关联?
我打算使用 cassandra 3.x。
【问题讨论】:
标签: database cassandra cql cql3