繁体   English   中英

单次订购商品

[英]Order items with single write

具有简单整数order值的高级概述可以帮助我理解:

   id (primary)   |    order (sort)   |    attributes .. 
----------------------------------------------------------
    ft8df34gfx             1                   ...
    ft8df34gfx             2                   ...
    ft8df34gfx             3                   ...
    ft8df34gfx             4                   ...
    ft8df34gfx             5                   ...

通常,更改order很容易(例如,如果用户在前端拖放列表项):转移项目,计算新的order值并使用新的order更新db中受影响的项目。


限制条件:

  • 一次没有所有项目,只有一部分(考虑分页)
  • 如果移动单个项目,则仅更新db中的单个项目(每班1个项目)

我最初的想法:

使用epoch作为order并添加一些独特的东西,以避免重复的epoch时间,例如<epoch>#<something-unique-to-item> 初始值为插入时间(因此默认顺序是最新的)。

客户/服务器(计算order )知道其子集中的每个子项的时代。

如果项目已移动,请查看上一个和下一个项目的纪元(如果具有上一个或下一个-可以移动到第一个或最后一个),在之间选择一个值并更新。 超过1个班次? 重复该过程。

但..

  1. 如果项目移动了足够的时间,则历元值之间的距离会越来越近,直到找不到整数整数的中间值为止。
    • 在插入时向纪元添加大量零? 仍然在某个时候达到极限。
  2. 如果将项目移至第一页或最后一页,并且上一页或下一页有某些项目(请记住,分页),我们将不知道这些值,也无法可靠地找到“之间的值”。
    • 从上一页和下一页获取1个额外的隐藏项? 查询变得复杂..

这有可能吗? 我应该将什么类型/值用作order

DynamoDB不允许更改特定项的分区键和排序键(要更改它们,则需要删除该项并使用新的键值重新创建),因此您可能需要使用本地或全局键次要索引。

假设您提到的分区键/排序键用于二级索引,建议您存储顺序的自然数(1、2、3等),然后根据需要进行更新。

实际上,您将需要考虑以下三种情况:

  • 添加新项目 -您将使用ScanIndexForward = false对二级分区键执行查询(以反转结果顺序),并在“ order”属性上进行投影,限制为1个结果。 到目前为止,这将为您提供最大的订单价值。 新项目的订单将仅为此最大值+ 1。
  • 删除项目 -乍一看似乎令人不安,但是您可以自由删除项目,而无需触及其他项目的顺序。 您的订购顺序中可能会有一些孔,但这没关系。
  • 更改订单 -真的没有办法解决; 您的应用程序逻辑将需要获取受影响项目的列表,并将所有新订单写入表中。 如果以前是(A,1),(B,2),(C,3)的项目被更改为A,C,B,则您需要同时写信给B和C以更新其订单。因此它们最终分别为(A,1),(C,2),(B,3)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM