nosql - Cassandra 数据库设计

标签 nosql schema cassandra

我有 RDBMS 背景,并设计了一个以 Cassandra 作为后端的应用程序,我不确定我的设计的有效性和可扩展性。

我正在开发某种书籍/电影/等的评级/反馈应用程序。由于Cassandra有flexible column family(稀疏结构)的概念,我想到了使用如下schema:

user-id (row key): book-id/movie-id (dynamic column name) - rating (column value)

如果我这样做,我最终会得到数百万列(在 RDBMS 中应该是行),但实际上并没有与行键相关联,例如:

user1: {book1:Rating-Ok; book1023:good; book982821:good}
user2: {book75:Ok;book1023:good;book44511:Awesome}

由于所有列族都存储在一个文件中,我不确定这是否是一个可扩展的设计(或者根本不是一个设计!)。此外,可能会有类似“选择'book125'的所有'good'评论”这样的查询。 我应该使用什么方法?

最佳答案

此设计具有完美的可扩展性。 Cassandra 以稀疏形式存储数据,因此空单元格不会占用磁盘空间。

缺点是cassandra在按值索引方面不是很好。有二级索引,但它们应该只用于索引一两列,而不是数百万列中的每一列。

有两种选择可以解决这个问题:

  • 物化 View (例如,此处描述:http://maxgrinev.com/2010/07/12/do-you-really-need-sql-to-do-it-all-in-cassandra/)。这允许构建一些预定义的查询集,可能是非常复杂的查询。
  • 可以使用某种 map/reduce 作业进行临时查询,它可以有效地遍历整个数据集。这听起来可能很可怕,但它仍然非常快:Cassandra 将所有数据存储在 SSTables 中,并且可以实现这种迭代以顺序扫描数据文件。

关于nosql - Cassandra 数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12403441/

相关文章:

mongodb mapreduce 函数不提供跳过功能,他们对此有什么解决方案吗?

mysql - mysql 列数据类型对保持效率很重要吗?

hibernate - hibernate4-maven-plugin 生成 PostgreSQL 模式的正确配置是什么?

cassandra - "PER PARTITION LIMIT"在cassandra的cql查询中是什么意思?

cassandra - 行缓存堆要求 (Cassandra 1.0)

MySQL - "text"列的替代方案来存储 HTML 内容

javascript - RavenDB 无法在 nodejs 上使用 AND 运算符执行搜索

android - Firestore 实现通知 View

content-management-system - 在我添加了 4-5 篇长博文(使用相同的架构)后,在 Sanity 中编辑博客文章的架构是否安全?

cassandra cql在辅助键上使用小于运算符删除