如何在cartod的dynamodb中设计一个表格

时间:2015-01-31 15:39:48

标签: amazon-dynamodb

我有一个用例,一个人可以没有。推车。这是可能的,因为1)用户可以使用购物车完成订单,并且在该购物车被认为是关闭之后2)用户可以将购物车放置2个月并且它被认为是过期的。如果用户在2个月大的购物车上添加新商品,则旧购物车标记为已过期并生成新购物车。

我尝试设计下表:

Table Name: Cart
Primary Hash Key: cartId (String)
Primary Range Key: updated (String)

我正在使用更新作为范围列,以便当我查询它时,我可以在用户更新这些时将所有购物车分类,我可以选择第一个(或最后一个)而不用自己排序以获得最新购物车。但是这会弄乱我的用例。

如果用户添加了另一个项目,我会更新购物车中的项目并更新更新的列。然而,这为我创建了另一个购物车(具有相同的购物车ID但具有新的更新列)。重新阅读文档之后,我明白主键是cartId的复合并且已更新,所以我应该将其删除。但是我相信我的用例足够真实,在我的情况下,我必须在应用程序中进行排序。另一种方法是使用自动增量作为范围,但这是放置列的非直观方式。如果有工作请告诉我。我正在使用DynamoDBMapper并发布我的类(只有几个字段)。

import java.util.Set;
import com.amazonaws.services.dynamodbv2.datamodeling.*;

@DynamoDBTable(tableName="Cart")
public class Cart {

    private String cartId;
    private String email;
    private Set<String> cartItemsJson;
    private String status;
    private String created;
    private String updated;


    @DynamoDBHashKey(attributeName="cartId")
    public String getCartId() {
        return cartId;
    }
    public void setCartId(String cartId) {
        this.cartId = cartId;
    }
    @DynamoDBAttribute(attributeName="email")
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @DynamoDBAttribute(attributeName="cartItems")
    public Set<String> getCartItemsJson() {
        return cartItemsJson;
    }
    public void setCartItemsJson(Set<String> cartItemsJson) {
        this.cartItemsJson = cartItemsJson;
    }
    @DynamoDBAttribute(attributeName="status")
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    @DynamoDBAttribute(attributeName="created")
    public String getCreated() {
        return created;
    }
    public void setCreated(String created) {
        this.created = created;
    }
    @DynamoDBRangeKey(attributeName="updated")
    @DynamoDBVersionAttribute(attributeName="updated")
    public String getUpdated() {
        return updated;
    }
    public void setUpdated(String updated) {
        this.updated = updated;
    }
}

这是持久层代码。我尝试了各种Save行为组合,但结果仍然相同。

protected static DynamoDBMapper mapper = new DynamoDBMapper(dynamoDbClient);
mapper.save(cart,new DynamoDBMapperConfig(DynamoDBMapperConfig.SaveBehavior.UPDATE));

1 个答案:

答案 0 :(得分:0)

在DynamoDB中,您无法更新哈希或范围键。更新它们意味着删除并创建一个新条目。

我知道您可以创建辅助索引。也许这会有所帮助。 此外,我认为您可以克服更新的范围键。您可以按如下方式创建表:

  • HashKey = userId
  • RangeKey = cardId(但cardId需要为每个用户排序)
  • 普通列=已更新
  • 普通列=等..

当您需要特定用户的最后一个cardId时,您可以获得前6行的hashkey =您的用户并进行反向排序,以便您先获得最后一行。 当您需要向卡片添加项目时,您不需要更新哈希/范围键。

希望它有所帮助。