【问题标题】:DynamoDB NoSQL design for queriesDynamoDB NoSQL 查询设计
【发布时间】:2023-03-23 01:08:02
【问题描述】:

我正在寻找存储用户事件的日志。这将是很多条目,所以我认为 DynamoDB 会很好,因为其他所有内容都托管在那里。

我需要以两种方式查询这些事件,一个日期(范围)的用户事件总数,偶尔还有一个日期的所有事件。

我正在考虑将其存储在一张表中,如user id(键)、sequence number(键)、date、time 和 duration。

应该是多张桌子吗?如何才能最有效地做到这一点?

【问题讨论】:

  • 序号是多少?它应该像一个仅用于引用事件的自动增量字段,还是什么?另一个问题:您想查询所有用户的日期的所有事件,还是特定用户的所有事件?
  • 我们有使每一行唯一的序列号,我们提供了这个。我们一次只需要查询一个用户。

标签: amazon-dynamodb nosql


【解决方案1】:

对于少量数据,这种结构是可以的。 请记住,序列号(您的范围键)必须由您提供。将日期选择为具有毫秒精度的 unix 时间戳作为排序键似乎是个好主意。

不需要额外的桌子。 但是,您的结构很大程度上取决于您想要实现的读写能力以及数据大小。

假设您的 user_id 是您的分区键。

对于每个不同的分区键值,所有表和索引项的总大小不能超过 10 GB。 单个分区最多可支持 3000 个读取容量单位或 1000 个写入容量单位。

您需要通过考虑这些限制来创建分区键。 例如,一个非常活跃的用户有很多事件,因此您需要超过 1000 个写入容量单位。不幸的是,您选择了用户 ID 作为分区。

在这种情况下,您被限制为 1000 个写入容量单位,因此您可能会遇到故障。

你需要有一个不同的结构。例如像这样的分区名称 user_id_1 user_id_2 等。因此,分区命名机制根据应用程序的需要将数据分布到分区。

查看这些关于 dynamodb 限制的链接。

Tables guidance, Partition distribution

【讨论】:

    【解决方案2】:

    我会为您的事件表建议以下结构:

    • 用户 id -- 哈希键
    • 事件日期/时间(以毫秒为单位的时间戳)--范围键
    • 持续时间

    将事件时间戳作为范围键应该足以为事件提供唯一性(除非用户可以在同一毫秒内拥有多个事件),因此您不需要序列号。

    有了这样的架构,您可以使用简单的query 获取用户在某个日期的所有事件。

    很遗憾,DynamoDB 不支持聚合查询,因此您无法快速获取用户的事件总数(您必须查询所有记录并手动计算总数)。 所以我建议为这样的用户事件统计创建单独的表:

    • 用户 id -- 哈希键
    • 日期 -- 范围键
    • events_cnt(用户在某个日期的事件总数)

    因此,在您将新记录添加到事件表后,您必须在统计表中为用户增加事件计数器,如下所示:

    var dynamodbDoc = new AWS.DynamoDB.DocumentClient();
    var params = {
      TableName : "user_events_stats",
      Key: {
          userId: "65716110-f4df-11e6-bc64-92361f002671" ,
          date:   "2017-02-17",
      },
      UpdateExpression: "SET #events_cnt = if_not_exists(#events_cnt, :zero) + :one",
      ExpressionAttributeNames: {
          "#events_cnt": "events_cnt",
      },  
      ExpressionAttributeValues: {
          ":one": 1,
          ":zero": 0,
      },  
    };
    
    dynamodbDoc.update(params, function(err, data) {
    
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      相关资源
      最近更新 更多