代码之家  ›  专栏  ›  技术社区  ›  user1668102

Cassandra数据库设计

  •  3
  • user1668102  · 技术社区  · 14 年前

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

    我正在开发一些书籍/电影等的评分/反馈应用程序。由于Cassandra有灵活列族(稀疏结构)的概念,我想到使用以下模式:

    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}
    

    由于所有柱族都存储在一个文件中,我不确定这是一个可伸缩的设计(还是一个设计!)。此外,可能会有以下查询 "pick all 'good' reviews of 'book125'" 。 我应该使用什么方法?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Wildfire    14 年前

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

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

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

    • 物化视图(例如,此处描述: http://maxgrinev.com/2010/07/12/do-you-really-need-sql-to-do-it-all-in-cassandra/ )。这允许构建一些预定义的查询集,可能是相当复杂的查询。
    • 通过某种映射/减少作业可以进行即席查询,这种作业可以有效地迭代整个数据集。这听起来可能很可怕,但仍然很快:Cassandra将所有数据存储在SSTables中,这种迭代可以实现为顺序扫描数据文件。
        2
  •  2
  •   phatfingers    14 年前

    从所需的一组查询开始,构造柱族以支持这些视图。尤其是在涉及的字段如此之少的情况下,每个CF都可以廉价地作为自己的数据索引视图。在提取过程中,密钥将最终将数据划分到一个特定的Cassandra节点,该节点可以按预先确定的顺序将一组宽行快速流式传输到应用服务器。这发挥了Cassandra的优势之一,因为与在RDBMS表的索引搜索中在各种轨道和扇区之间来回跳跃相比,在物理介质上读取的碎片(当未缓存时)极低。

    如果可用,一种有用的方法是选择键来分割数据,这样对该片段中的所有列进行全面扫描是一个合理的提议,并且非常适合您的查询。然后,你过滤你不需要的东西,即使过滤是在你的客户端(应用服务器)中执行的。一部电影的所有评论都是一个很好的例子。即使你过滤了积极的评论,或者只提供了最近的评论或摘要,你仍然可以合理地获取该键的所有行,然后抛出你不需要的。

        3
  •  0
  •   Dean Hiller    14 年前

    另一种选择是,如果你能弄清楚如何对数据进行分区(按时间、按类别),playOrm提供了一种将S-SQL划分到分区中的解决方案,这种解决方案非常快速。它非常像RDBMS,只是您对数据进行分区以保持可伸缩性,并且可以拥有任意多的分区。分区可以包含数百万行(尽管在一个分区中,我不会超过1000万行)。

    后来 院长

    推荐文章