亚马逊 QLDB 设计原则

Amazon QLDB Design Pricinples

我想知道在 QLDB 中设计 tables 的最佳方式,以及它是否最好执行联接或嵌套文档。 例如,如果我有 tables transactionpayment,其中付款必须与交易相关联。以下哪个选项最好;

嵌套文档选项(一个 table)

{
    'payment_reference': 'abc123',
    'transaction': {
        'id': 123,
        'name': 'John Doe',
        'amount': ''
    },
    'fees': '',
    'amount_paid': ''
}

两个Table选项

付款凭证

{
    'payment_reference': 'abc123',
    'transaction_id': 12,
    'fees': '',
    'amount_paid': ''
}

交易文档

{
    'id': 123,
    'amount': '',
    'name': 'John Doe',
   
}

  • 如果在嵌套文档选项中选择交易文档嵌套在付款文档中,请记住文档大小限制为 128KB,如 QLDB limits documentation 中所述。如果在嵌套后可以预见付款单据足够大以达到此限制,则此选项可能存在风险。
  • 如果您预见到必须对交易文档中的某些字段编制索引,您可以创建两个单独的 tables 并改为执行连接。 (如 create index reference 中所述,QLDB 不允许对文档的嵌套值进行索引,并且如我们的限制文档中所述,AWS QLDB 允许每个 table 最多 5 个索引)

以上建议仅基于 post 中提供的信息,我们不了解此 use-case 中当前的访问模式,需要进一步了解才能更好地回答。 您可以拨打 qldb-outbound 联系团队 amazon.com 以进一步咨询您的 use-case。

谢谢

我认为@Aurgho 已经回答了你的问题。但我将根据 Aurgho 所说的内容提出我的一般想法,这可能会帮助其他人post 提出类似的问题。

有多种因素会影响您的设计决策,以及 QLDB 强加的配额和限制。以下是一些可能有助于您向前思考的建议:

  • 查询模式:此时,Amazon QLDB 只允许在顶级字段上创建索引。在嵌套文档设计(选项 #1)中,如果您的查询将在嵌套文档的任何字段上进行,那么这些查询将不会使用索引并将执行扫描。这会影响您的表现。使用选项 #2,您可以在两个表上都有索引,并在连接条件中使用这些索引字段。

  • 访问模式:写入次数是否明显多于读取次数?如果您的读取稀疏并且对稍微增加的延迟不是非常敏感,那么从数据建模的角度来看,选项 #1 可能更好,因为所有与支付相关的信息都被捕获在一个文档中。另一方面,如果你有更多的读取并且读取对延迟敏感,你应该从前一点的角度评估你的选择。

  • 配额和限制:Amazon QLDB 对文档大小有配额(目前为 128 KB)https://docs.aws.amazon.com/qldb/latest/developerguide/limits.html#limits.fixed。如果您计划随时添加更多字段,则每个文档的大小可以随着嵌套字段的增加而不断增加,您最终可能 运行 达到文档大小限制。还有其他配额会根据您的用例影响您的决定。

一般来说,如果您不打算查询嵌套文档中的字段 and/or 您的写入 >>> 读取 and/or 您的读取对延迟不是非常敏感 and/or 您的文档大小将保持在当前施加的限制内,您可以使用选项 #1。当您将数据推送到 QLDB(仅插入一次)以及必须在代码中处理文档时,将所有数据放在一个文档中可以使您在应用程序层轻松,但您必须选择 trade-offs正确。

这些只是帮助您前瞻性思考的一般建议。您可能有其他用例,其中任何一个设计选项比另一个更令人信服,并且您可以 trade-off 某些 advantages/disadvantages 介于两者之间。

另外,QLDB 有一些优化查询性能的建议,可以进一步帮助您做出决定https://docs.aws.amazon.com/qldb/latest/developerguide/working.optimize.html