【问题标题】:Wide rows vs Collections in CassandraCassandra 中的宽行与集合
【发布时间】:2015-10-20 10:11:37
【问题描述】:

我正在尝试在 Cassandra 中建模多对多关系,例如项目-用户关系。用户可以喜欢许多物品,并且许多用户可以购买物品。让我们还假设“喜欢”事件发生的顺序不是问题,并且最常用的查询只是根据项目和用户返回“喜欢”。

有几篇讨论数据建模的帖子 http://www.ebaytechblog.com/2012/07/16/cassandra-data-modeling-best-practices-part-1/

另一种方法是将 ItemID 集合存储在 User 表中,以表示该用户喜欢的项目,并在 CQL3 中的 Items 表中执行类似的操作。

问题

  1. 使用该集合是否会影响性能?我认为它们会转化为复合列?那么读取模式、缓存等因素应该差不多吧?

  2. 对于编写繁重的应用程序,集合的性能是否会降低?频繁更新集合会降低性能吗?

【问题讨论】:

    标签: cassandra data-modeling cql cql3 nosql


    【解决方案1】:

    我认为使用宽行而不是集合有几个优点:

    1. 集合中允许的元素数为 65535(无符号短整数)。如果您的集合中可能包含多于这么多的记录,则使用宽行可能会更好,因为该限制要高得多(每个分区 20 亿个单元格(行 * 列))。
    2. 读取集合列时,每次都会读取整个集合。将此与宽行进行比较,您可以限制查询中读取的行数,或根据聚类键(即日期 > 2015-07-01)限制查询条件。

    对于您的特定用例,我认为对“items_by_user”表建模比在“用户”表上的list<item> 列更理想。

    【讨论】:

    • 你不认为如果我创建items_by_user 表,那么在阅读时我将不得不进行单独的 SELECT 查询以读取数据?
    • 不得不这样做并不罕见。您只需要考虑将数据存储在查询的上下文中。如果每个人在查询项目时也需要完整的用户数据,则可以将用户数据存储在静态列(名称、地址等)中,这样它们在用户共享的所有项目之间共享。如果您已经拥有上一个查询中的用户数据,或者您根本不需要它,则不需要 items_by_user 中的数据。
    • 所以 cassandra 适合将数据插入多个表并在不同的表上执行多个 SELECT,例如Select id FROM table1 然后SELECT col FROM table2 where rowId = <id from first table>
    • 当然可以,如果它是一种足够常见的模式,您可以将数据全部放在一个表中,如果这样做有意义的话。
    • 您的问题有点离题,如果您需要更多信息,请创建一个新问题,我可以提供更多信息。
    猜你喜欢
    • 2014-08-25
    • 2016-08-13
    • 1970-01-01
    • 2015-05-10
    • 2016-08-10
    • 1970-01-01
    • 2019-03-27
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多