我是cassandra的新手,想看看如何在cassandra中建模我们当前的sql数据。数据库存储包含document_id、last_modified_time、size_in_bytes等多种数据的文档元数据,文档数量可以任意大,因此我们正在寻找一种可伸缩的存储和查询解决方案。
需要两个范围查询。
还有一组查询,其中文档需要按特定的元数据分组。
基于这些查询设计数据模型的最佳实践是什么?
我最初的想法是有一个表(在Cassandra2.0中,CQL3.0中),将last_mod_time作为次要索引,如下所示
创建表t_document ( document_id bigint,
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表上为用户创建一个辅助索引?
谢谢你的帮助。
发布于 2015-02-03 04:13:15
说到不平等,你在卡桑德拉没有太多的选择。它们必须是领先的群集列(或辅助索引)。因此,数据模型可能如下所示:
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亿个单元,但更重要的是,一个分区从不跨越节点。所以这种方法不会扩大。
您可以在表上创建辅助索引:
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上的精度,从而在一定程度上缓解基数问题。
https://stackoverflow.com/questions/22947507
复制相似问题