我有一张邮件表( 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 里只存未读邮件的话大小应该是够了。
1
yangtukun1412 2017-08-24 10:42:06 +08:00 1
用 userid 做主键, 可能导致数据不够离散, 在部分 partition 上产生单点问题.
查询的话, dynamodb 支持索引的: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html |
2
imherer OP @yangtukun1412 谢谢你的回答。 那应该用什么做主键呢?
|
3
fuyufjh 2017-08-24 10:47:23 +08:00
用关系型数据库的视角看,每条邮件是一行,显然主键应该是邮件 ID 才合理吧
|
4
fuyufjh 2017-08-24 10:49:10 +08:00 1
假设绝大部分查询都是针对某个特定用户的,那我会把 user_id 作为 PrimaryKey, email_id 作为 SortKey
|
6
LiHaiWordGe 2017-08-24 10:52:47 +08:00 1
组合 uid+ type 生成一个主键,一个用户可能有 N 个 type 的主键 直接查询主键。
其他数据可以组合其他索引。 http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/GuidelinesForTables.html |