gpt4 book ai didi

amazon-web-services - DynamoDB 分层数据和条件表设计

转载 作者:行者123 更新时间:2023-12-02 00:51:24 25 4
gpt4 key购买 nike

我在设计 DynamoDB 表以支持相当简单的访问模式时遇到问题。我希望你能帮我一点点:)

我有 4 种不同的产品 类型 (A、B、C 和 D)具有 价格和一个 地点 (国家#州#城市)。

访问模式是:

  • 按产品过滤 类型
  • 按产品过滤 类型 地点
  • 按产品过滤 类型 , 地点 价格
  • 按产品过滤 类型 , 地点 价格并按 排序价格

  • 问题是位于 USA#NY#NY 的产品必须在 USA#NY 和美国也有售。此外,用户需要能够首先按价格过滤并按贵/便宜排序。

    示例:

    数据:

    产品:ID_1 | A型 |地点美国#NY#NY |价格 100$
    产品:ID_2 | A型 |地点美国#NY#NY |价格 200$

    用例:
  • 用户 U1 在 USA#NY#NY 中搜索价格 < 500$ 的产品类型 A
    贵先
  • 用户 U2 搜索价格 < 的产品类型 A
    美国250$#NY先便宜

  • 预期结果:
  • U1 应该得到 ID_2、ID_1
  • U2 应该得到 ID_1、ID_2

  • 两种产品都应该以正确的顺序向两个用户展示,即使他们在不同的区域进行搜索。

    能够通过 过滤地点 价格并按 排序价格我想出了这个解决方案,但是,很多数据被复制了,我相信一定有更好的解决方案:

    PK | SK & GSI PK | GSI SK |其他产品详情(重复数据)
    -------------------------------------------------- -------------------------
    身份证 |类型 |价格 |图像、名称等
    身份证 |类型#美国 |价格 |图像、名称等
    身份证 |类型#美国#纽约 |价格 |图像、名称等
    身份证 |类型#美国#纽约#纽约 |价格 |图像、名称等

    这解决了每个访问模式:
  • 按产品过滤 类型

    GSI PK = 类型
  • 按产品过滤 类型 地点

    GSI PK = begins_with(TYPE#USA#NY#...)
  • 按产品过滤 类型 , 地点 价格

    GSI PK = TYPE#USA & GSI SK > 150

    GSI PK = TYPE#USA#NY & GSI SK > 150
  • 按产品过滤 类型 , 地点 价格并按 排序价格

    GSI PK = TYPE#USA & GSI SK > 150 ScanIndexForward 真/假

    GSI PK = TYPE#USA#NY & GSI SK > 150 ScanIndexForward true/false

  • 读取是有效的,但大量数据被复制(价格和产品详细信息),更新一个项目需要多次写入。

    是否有可能在不复制所有产品细节的情况下实现这一目标?

    最佳答案

    我认为你误解了分层模式

    你只需要

    PK = 身份证

    GSI
    PK = 类型
    SK = 国家#州#城市

    然后,您可以使用以下命令查询 GSI

  • 查询(GSI,PK = 'TYPEA')
  • Query(GSI, PK = 'TYPEA', SK 以 'USA#' 开头)
  • Query(GSI, PK = 'TYPEA', SK 以 'USA#NY#' 开头)
  • Query(GSI, PK = 'TYPEA', SK 以 'USA#NY#NY#' 开头)

  • 可以将价格过滤添加到上述任何查询中。
    Query(GSI, PK = 'TYPEA', SK 以 'USA#NY#NY#' 开头,过滤价格 > 100.00)

    请注意,这种过滤方式不会节省任何读取容量,简单地过滤客户端可能更有效。

    关键是您在表 中的每行只需要(并且允许)GSI 中的 1 行

    唯一的问题是,您是否希望任何类型的数据都超过 10GB? GSI,如 DDB 表本身,每个分区有 10GB 的限制。如果您确实希望每种类型超过 10GB,我会重新考虑类型是有效访问模式的想法。没有人会滚动浏览 10GB 的数据。

    老实说,我不喜欢不处理至少一种预期访问模式的 DDB 表。如果 type 是那么大的驱动程序,我会考虑这样的表:

    PK = 类型
    SK = 身份证

    LSI
    PK =(同表)
    SK = 国家#州#城市

    现在您的查询变成
  • 查询(表,PK = 'TYPEA')
  • Query(LSI, PK = 'TYPEA', SK 以 'USA#' 开头)
  • Query(LSI, PK = 'TYPEA', SK 以 'USA#NY#' 开头)
  • Query(LSI, PK = 'TYPEA', SK 以 'USA#NY#NY#' 开头)

  • 并且您无需为 GSI 支付额外费用。

    编辑
    在考虑价格过滤器时,它真的会对性能或成本产生很大的影响。您为每 1MB RCU 的数据付费,而不管返回的数据是 1 行还是 100 行。那么您的行有多大以及您希望过滤的价格差有多大?

    除了发电机之外,您是否考虑过其他选择? Aurora RDS 肯定会提供查询的灵活性,您似乎需要更轻松的查询。或者,除了 DDB 之外,还可以添加 Elasticsearch。

    关于amazon-web-services - DynamoDB 分层数据和条件表设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57304783/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com