• 请不要在回答技术问题时复制粘贴 AI 生成的内容
imherer
V2EX  ›  程序员

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

  •  
  •   imherer · Aug 24, 2017 · 2252 views
    This topic created in 3365 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
    yangtukun1412
    Aug 24, 2017❤️1
    1
    用 userid 做主键, 可能导致数据不够离散, 在部分 partition 上产生单点问题.

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

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