首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cassandra数据模型

Cassandra数据模型
EN

Stack Overflow用户
提问于 2014-04-08 20:28:53
回答 1查看 117关注 0票数 0

我是cassandra的新手,想看看如何在cassandra中建模我们当前的sql数据。数据库存储包含document_id、last_modified_time、size_in_bytes等多种数据的文档元数据,文档数量可以任意大,因此我们正在寻找一种可伸缩的存储和查询解决方案。

需要两个范围查询。

  1. 选择last_modified_time、>=x和last_modified_time的所有文档
  2. 选择大小为>= x和size <= y的所有文档

还有一组查询,其中文档需要按特定的元数据分组。

  1. 选择用户在(x,y,z)中的所有文档

基于这些查询设计数据模型的最佳实践是什么?

我最初的想法是有一个表(在Cassandra2.0中,CQL3.0中),将last_mod_time作为次要索引,如下所示

创建表t_document ( document_id bigint,

代码语言:javascript
运行
复制
 last\_mod\_time bigint  ,      size bigint,      user text,      ....      primary key (document\_id, last\_mod\_time)  } 

这应该可以处理查询1。

是否需要为查询2创建另一个具有主键as (document_id,size)的表?或者,我可以在同一表的主键中添加大小作为第三项,例如(document_id、last_mod_time、size)。但是在这种情况下,第二个查询不需要在where子句中使用last_mod_time就能工作吗?

对于查询3 (它是一个或多个用户的所有文档),创建主键位于其中的t_user_doc表(user,doc_id)是否是最佳实践?或者更好的方法是在同一个t_document表上为用户创建一个辅助索引?

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2015-02-03 04:13:15

说到不平等,你在卡桑德拉没有太多的选择。它们必须是领先的群集列(或辅助索引)。因此,数据模型可能如下所示:

代码语言:javascript
运行
复制
CREATE TABLE docs_by_time (
dummy int,
last_modified_time timestamp,
document_id bigint,
size_in_bytes bigint,
PRIMARY KEY ((dummy),last_modified_time,document_id));

“虚拟”列总是设置为相同的值,并被起诉为占位符分区键,所有数据都存储在一个分区中。

这种数据模型的缺点是,实际上,所有数据都存储在一个分区中。每个分区最多有20亿个单元,但更重要的是,一个分区从不跨越节点。所以这种方法不会扩大。

您可以在表上创建辅助索引:

代码语言:javascript
运行
复制
CREATE TABLE docs (
document_id bigint,
last_modified_time timestamp,    
size_in_bytes bigint,
PRIMARY KEY ((dummy),last_modified_time,document_id));

CREATE INDEX docs_last_modified on docs(last_modified);

但是,二级索引有重要的缺点(http://www.slideshare.net/edanuff/indexing-in-cassandra),对于基数较高的数据不推荐使用。您可以通过只存储day组件来降低last_modified_time上的精度,从而在一定程度上缓解基数问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22947507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档