Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 哈希和范围主键的性能:Dynamodb_Javascript_Node.js_Amazon Dynamodb_Loopbackjs - Fatal编程技术网

Javascript 哈希和范围主键的性能:Dynamodb

Javascript 哈希和范围主键的性能:Dynamodb,javascript,node.js,amazon-dynamodb,loopbackjs,Javascript,Node.js,Amazon Dynamodb,Loopbackjs,我正在使用Node.js和loopback构建一个应用程序。应用程序的一个组件将登录尝试存储到DynamoDB中。我是这个数据库的新手,我遇到了一些问题 目前,我的哈希键是电子邮件,范围键是登录尝试发生时的unix时间戳。本质上,我需要从数据库中获取所有数据,以生成上次登录尝试的列表。第一个想法是使用扫描,但是它不允许根据最近的登录尝试对列表进行排序。使用查询的问题是,我必须访问所有电子邮件,而不仅仅是特定于一封电子邮件的项目。我认为我可以使所有的散列值都相同,但这会在dynamoDB存储数据的

我正在使用Node.js和loopback构建一个应用程序。应用程序的一个组件将登录尝试存储到DynamoDB中。我是这个数据库的新手,我遇到了一些问题

目前,我的哈希键是电子邮件,范围键是登录尝试发生时的unix时间戳。本质上,我需要从数据库中获取所有数据,以生成上次登录尝试的列表。第一个想法是使用扫描,但是它不允许根据最近的登录尝试对列表进行排序。使用查询的问题是,我必须访问所有电子邮件,而不仅仅是特定于一封电子邮件的项目。我认为我可以使所有的散列值都相同,但这会在dynamoDB存储数据的方式的基础上产生性能问题


有没有其他人遇到过这种问题并找到了解决方案

像Amazon DynamoDB这样的NoSQL数据库通过特定的主键(“散列”)存储和检索数据,效果最佳。还可以通过主键加上附加值(“哈希和范围”)来标识数据

然而,您想要知道“最后一次登录”的要求并不适合NoSQL数据库,因为扫描数据是一个非常CPU和IO密集的过程

另一种方法是为每个用户创建一个项目(记录),并在用户上次登录时的该项目上存储一个属性(类似于“列”的概念)。这样,您只需检索一条特定记录即可发现上次登录时间


如果您还希望保存登录尝试的完整历史记录,则可以在单独的表中完成此操作,该表包含一个哈希和范围以及每次登录尝试一项。这与上表不同,上表中每个用户只有一个项。

您可以尝试使用bucketizing您的unix时间戳,以从DynamoDB的查询功能中获益

模式示例:

  • 哈希键=日期
  • 范围键=时间戳
  • 其他属性=电子邮件
示例项: {“日期”:“2015年7月31日”,“时间戳”:1438393927,“电子邮件”:abc@def.com“}

使用此模式,特定日期内的所有登录尝试都将存储在同一哈希键下。通过提供当前日期作为哈希键,可以高效地查询最近的登录。您甚至可以进一步深入,让哈希键表示一个小时

查询示例:

  • 关键条件:{“日期”=“01/01/2015”}
  • ScanIndexForward:false//最新登录优先
示例结果:

  • {“日期”:“2015年1月1日”,“时间戳”:1420153200,“电子邮件”:abc@xyz.com“}
  • {“日期”:“2015年1月1日”,“时间戳”:1420153199,“电子邮件”:def@xyz.com“}
  • {“日期”:“2015年1月1日”,“时间戳”:1420153198,“电子邮件”:abc@xyz.com“}
Pro:均匀分布的数据、可扩展的、良好的时间局部性,用于高效的基于时间的查询

Con:查询日期范围/存储桶上的登录尝试并不是那么简单。即,过去3天的登录需要3个单独的查询(每个日期一个)


PS:如果您的查询模式既需要按日期查询,也需要通过电子邮件查询,请使用全局二级索引(GSI)

谢谢!由于这些限制,我最终创建了一个二级索引,并且我只在尝试中显示失败的登录,这使得这个过程更加容易!感谢所有的输入,我应该通过使用二级索引和仅查询失败的登录尝试来采取不同的路线。