V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
imherer
V2EX  ›  程序员

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

  •  
  •   imherer · Aug 24, 2017 · 1916 views
    This topic created in 3182 days ago, the information mentioned may be changed or developed.

    我有一张邮件表( 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 replies    2017-08-25 11:36:38 +08:00
    yangtukun1412
        1
    yangtukun1412  
       Aug 24, 2017   ❤️ 1
    用 userid 做主键, 可能导致数据不够离散, 在部分 partition 上产生单点问题.

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

    http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/GuidelinesForTables.html
    fuyufjh
        7
    fuyufjh  
       Aug 25, 2017
    @imherer UUID ?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5682 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 07:59 · PVG 15:59 · LAX 00:59 · JFK 03:59
    ♥ Do have faith in what you're doing.