有用过 dynamodb 的吗?请教一个问题

2017-08-24 10:26:50 +08:00
 imherer

我有一张邮件表( mail ),里面的主要字段如下:

uid - 玩家 id
status - 邮件状态(分为 未读、已读)
type - 邮件类型

还有一些邮件的时间、来源什么的。

所有用户的所有邮件都存在 mail 这个表里,如果用关系型数据库来做的话,我想要查询玩家未读或者已读邮件直接

SELECT * FROM mail WHERE uid = ? AND type = ?这样就搞定了

但是现在用 dynamodb 来实现有点问题,因为 dynamodb 里面所有的查询除了 scan 全部都得带上这个表的主键做为条件,主键在这个表里就必须是唯一的。 从结构上来看,我目前的想法是把 uid 设为主键,那这样的话在 mail 这个表里每个用户就只能有一个 item,即如下结构:

用户 1001 的邮件
{
	uid:1001,
	mails:[] // 这个 array 里存这个玩家的所有邮件
}
用户 1002 的邮件
{
	uid:1002,
	mails:[] // 这个 array 里存这个玩家的所有邮件
}

不知道这样的设计是否合理?

另外 dynamodb 每个 item 有 400k 的大小限制,如果这个 mails 里只存未读邮件的话大小应该是够了。

1438 次点击
所在节点    程序员
7 条回复
yangtukun1412
2017-08-24 10:42:06 +08:00
用 userid 做主键, 可能导致数据不够离散, 在部分 partition 上产生单点问题.

查询的话, dynamodb 支持索引的:
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html
imherer
2017-08-24 10:44:08 +08:00
@yangtukun1412 谢谢你的回答。 那应该用什么做主键呢?
fuyufjh
2017-08-24 10:47:23 +08:00
用关系型数据库的视角看,每条邮件是一行,显然主键应该是邮件 ID 才合理吧
fuyufjh
2017-08-24 10:49:10 +08:00
假设绝大部分查询都是针对某个特定用户的,那我会把 user_id 作为 PrimaryKey, email_id 作为 SortKey
imherer
2017-08-24 10:50:15 +08:00
@fuyufjh 那这样的话 email_id 从哪里来呢?
LiHaiWordGe
2017-08-24 10:52:47 +08:00
组合 uid+ type 生成一个主键,一个用户可能有 N 个 type 的主键 直接查询主键。
其他数据可以组合其他索引。

http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/GuidelinesForTables.html
fuyufjh
2017-08-25 11:36:38 +08:00
@imherer UUID ?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/385368

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX