在 Cassandra 的地图或行中存储项目

Storing items in a map or in rows in Cassandra

我需要在 cassandra 中按客户存储用户列表。我看到了两种基本方法:

A: create table users (  // one row per user
     customer int, userId int, primary key (customer, userId),
     login text, name text, email text
   );

B: create table users (  // one row per customer
     customer int primary key, users map<int, text>
   );

在第二种方法中,我会将用户数据的 JSON 表示形式存储为 "text"。

我将在table上进行如下操作:

问题如下:

1) 对于大型用户列表,B 不是一个好主意。 "large" 是什么数量级?

2) 您是否期望 B 对于小用户列表有更好的性能? "small" 是什么数量级?

3) 您认为 A 或 B 还有哪些优点/缺点?

(对于那些需要知道的人:我正在使用 scala / datastax 驱动程序 / phantom 来访问数据库。)

我肯定会坚持选择 A。

  1. 集合最多可以包含 64k 个可查询元素,因此这是您的硬性限制。并且 C* 在查询期间读取 all 集合,因此您希望让集合尽可能为空以避免巨大的读取惩罚。

  2. 我希望性能具有相同的数量级,因为两者都是顺序读取。

  3. 在 B 中你将使用 not 幂等查询来更新集合。 我的错误,它是一个地图,不是列表。

  4. A​​ 使更新架构变得非常容易。在 B 中,您需要读取-修改-写入您的记录。

坚持选择 A。