在 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上进行如下操作:
- 插入/更新/删除单个用户
- 读取客户的所有用户
- 通过 ID 和客户读取单个用户
问题如下:
1) 对于大型用户列表,B 不是一个好主意。 "large" 是什么数量级?
2) 您是否期望 B 对于小用户列表有更好的性能? "small" 是什么数量级?
3) 您认为 A 或 B 还有哪些优点/缺点?
(对于那些需要知道的人:我正在使用 scala / datastax 驱动程序 / phantom 来访问数据库。)
我肯定会坚持选择 A。
集合最多可以包含 64k 个可查询元素,因此这是您的硬性限制。并且 C* 在查询期间读取 all 集合,因此您希望让集合尽可能为空以避免巨大的读取惩罚。
我希望性能具有相同的数量级,因为两者都是顺序读取。
在 B 中你将使用 not 幂等查询来更新集合。 我的错误,它是一个地图,不是列表。
A 使更新架构变得非常容易。在 B 中,您需要读取-修改-写入您的记录。
坚持选择 A。
我需要在 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上进行如下操作:
- 插入/更新/删除单个用户
- 读取客户的所有用户
- 通过 ID 和客户读取单个用户
问题如下:
1) 对于大型用户列表,B 不是一个好主意。 "large" 是什么数量级?
2) 您是否期望 B 对于小用户列表有更好的性能? "small" 是什么数量级?
3) 您认为 A 或 B 还有哪些优点/缺点?
(对于那些需要知道的人:我正在使用 scala / datastax 驱动程序 / phantom 来访问数据库。)
我肯定会坚持选择 A。
集合最多可以包含 64k 个可查询元素,因此这是您的硬性限制。并且 C* 在查询期间读取 all 集合,因此您希望让集合尽可能为空以避免巨大的读取惩罚。
我希望性能具有相同的数量级,因为两者都是顺序读取。
在 B 中你将使用 not 幂等查询来更新集合。我的错误,它是一个地图,不是列表。A 使更新架构变得非常容易。在 B 中,您需要读取-修改-写入您的记录。
坚持选择 A。