我有 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/