如何在这种特殊情况下对卡桑德拉进行建模



如果我下面有表格结构,我该如何查询

"source = 'abc' and created_at >= '2016-01-01 00:00:00'"?
CREATE TABLE articles (
    id text,
    source text,
    created_at timestamp,
    category text,
    channel text,
    last_crawled timestamp,
    text text,
    thumbnail text,
    title text,
    url text,
    PRIMARY KEY (id)
)

我想根据以下内容对我的系统进行建模:http://www.ebaytechblog.com/2012/07/16/cassandra-data-modeling-best-practices-part-1/

编辑:

我们正在做的事情与你的提议非常相似。不同之处在于我们的主键在源代码周围没有括号: PRIMARY KEY (source, created_at, id) .我们还有另外两个索引:

CREATE INDEX articles_id_idx ON crawler.articles (id); 
CREATE INDEX articles_url_idx ON crawler.articles (url); 

我们的系统真的很慢。你有什么建议?

感谢您的回复!

给定表结构

CREATE TABLE articles (
    id text,
    source text,
    created_at timestamp,
    category text,
    channel text,
    last_crawled timestamp,
    text text,
    thumbnail text,
    title text,
    url text,
    PRIMARY KEY ((source),created_at, id)
)

您可以发出以下查询:

SELECT * FROM articles WHERE source=xxx // Give me all article given the source xxx
SELECT * FROM articles WHERE source=xxx AND created_at > '2016-01-01 00:00:00'; // Give me all articles whose source is xxx and created after 2016-01-01 00:00:00

主键中的对 (created_at,id) 在这里保证文章的单一性。事实上,可以同时created_at 2 篇不同的文章

鉴于您之前发布的问题中的知识,我说索引正在减慢您的查询速度,您需要解决两件事:

  1. 仅当文章不存在时才写文章
  2. 基于源和范围查询的查询文章创建于

基于这两个,我会选择两个表格:

反向索引表

CREATE TABLE article_by_id (
    id text,
    source text,
    created_at timestamp,
    PRIMARY KEY (id) ) WITH comment = 'Article by id.';

此表将用于在文章首次到达时插入文章。根据INSERT ... IF NOT EXISTS后的 return 语句,您将知道文章是现有的还是新的,如果它是新的,您将写入第二个表。此外,此表还可以用于根据文章ID查找第二个表的所有关键部分。如果您需要完整的文章数据,则可以将所有字段(类别,渠道等)添加到此表中。这将是在一个分区中仅包含单个文章的瘦行。

插入示例:

INSERT INTO article_by_id(id, source, created_at) VALUES (%s,%s, %s) IF NOT EXISTS; 

无论是否应用了此查询,Java 驱动程序都会返回 true 或 false。 可能在 python 驱动程序中是相同的,但我没有使用它。

范围查询和按源查询的表

正如 doanduyhai 建议的那样,您创建第二个表:

CREATE TABLE articles (
    id text,
    source text,
    created_at timestamp,
    category text,
    channel text,
    last_crawled timestamp,
    text text,
    thumbnail text,
    title text,
    url text,
    PRIMARY KEY ((source),created_at, id)
)

在此表中,仅当第一个 INSERT 返回 true 表示您有新文章而不是现有文章时,您才会写入。此表将提供范围查询和按源查询。

改进建议

通过使用timeuuid而不是timestamp进行created_at,您可以确定没有两篇文章可以具有相同的created_at,并且您可以将id一起松散并依靠timeuuid。但是从第二个问题中,我可以看到您依赖外部id,因此想将其作为旁注提及。

最新更新