V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imherer
V2EX  ›  程序员

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

  •  
  •   imherer · 2017-08-24 10:26:50 +08:00 · 1524 次点击
    这是一个创建于 2648 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一张邮件表( 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 里只存未读邮件的话大小应该是够了。

    7 条回复    2017-08-25 11:36:38 +08:00
    yangtukun1412
        1
    yangtukun1412  
       2017-08-24 10:42:06 +08:00   ❤️ 1
    用 userid 做主键, 可能导致数据不够离散, 在部分 partition 上产生单点问题.

    查询的话, dynamodb 支持索引的:
    http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html
    imherer
        2
    imherer  
    OP
       2017-08-24 10:44:08 +08:00
    @yangtukun1412 谢谢你的回答。 那应该用什么做主键呢?
    fuyufjh
        3
    fuyufjh  
       2017-08-24 10:47:23 +08:00
    用关系型数据库的视角看,每条邮件是一行,显然主键应该是邮件 ID 才合理吧
    fuyufjh
        4
    fuyufjh  
       2017-08-24 10:49:10 +08:00   ❤️ 1
    假设绝大部分查询都是针对某个特定用户的,那我会把 user_id 作为 PrimaryKey, email_id 作为 SortKey
    imherer
        5
    imherer  
    OP
       2017-08-24 10:50:15 +08:00
    @fuyufjh 那这样的话 email_id 从哪里来呢?
    LiHaiWordGe
        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
    fuyufjh
        7
    fuyufjh  
       2017-08-25 11:36:38 +08:00
    @imherer UUID ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   970 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:19 · PVG 04:19 · LAX 12:19 · JFK 15:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.