c# - 单表设计 - DynamoDB - 将两个表合并为一个?

标签 c# .net amazon-web-services amazon-dynamodb

我看过this video我正在考虑单表设计。就像视频中的示例一样,将这两个表合并为一个表是个好主意吗?由于它们彼此相关(用户交易和用户转账,即存款和取款),并且访问模式都是关于给定的交易所名称和账户名称。

enter image description here

我现在感兴趣的访问模式:

  • 获取给定交易所的最后一次用户转账和帐户名称。
  • 按日期范围获取所有用户交易。
  • 按日期范围获取所有用户转移。

将两个表合并为一个具有相同 PK 和 SK 的表是个好主意吗?有些商品带有 SK TradeDate#12/17/2022,其他商品则带有 TransferDate#12/17/2022

我即将弄清楚如何进行日期范围查询。我必须使用 GSI。

用户交易

+-------------------------------+----------------------------------------+---------+----------+-----+-------------+------------+-------+-------------+----------+-------------------------------+-----------+-----------------------------------+
|              PK               |                   SK                   | Account | Exchange | Fee | FeeCurrency | Instrument | Price | ProductType | Quantity |           TradeDate           |  TradeId  |             UpdatedAt             |
+-------------------------------+----------------------------------------+---------+----------+-----+-------------+------------+-------+-------------+----------+-------------------------------+-----------+-----------------------------------+
| Exchange#Binance#Account#main | TradeDate#12/17/2022 4:59:12 PM +02:00 | main    | Binance  |   0 | BNB         | BTCBUSD    |     0 | Spot        |  0.00086 | 2023-01-26T23:17:56.436+00:00 | 814696766 | 2023-01-26T23:17:57.7786154+00:00 |
| Exchange#Binance#Account#main | TradeDate#12/17/2022 5:38:23 PM +02:00 | main    | Binance  |   0 | BNB         | BTCBUSD    |     0 | Spot        |  0.00086 | 2023-01-26T23:57:06.876+00:00 | 814746356 | 2023-01-26T23:57:08.3696852+00:00 |
| Exchange#FTX#Account#main     | TradeDate#12/17/2021 5:38:23 PM +02:00 | main    | Binance  |   0 | BNB         | BTCBUSD    |     0 | Spot        |  0.00086 | 2023-01-26T23:57:21.226+00:00 | 814746461 | 2023-01-26T23:57:21.8543695+00:00 |
| Exchange#FTX#Account#main     | TradeDate#12/19/2022 4:59:12 PM +02:00 | main    | Binance  |   0 | BNB         | BTCBUSD    |     0 | Spot        |  0.00086 | 2023-01-26T23:57:21.901+00:00 | 814746513 | 2023-01-26T23:57:22.528155+00:00  |
| Exchange#Binance#Account#main | TradeDate#12/17/2022 4:59:12 PM +02:00 | main    | Binance  |   0 | BNB         | BTCBUSD    |     0 | Spot        |  0.00086 | 2023-01-26T23:57:22.348+00:00 | 814746517 | 2023-01-26T23:57:22.9753506+00:00 |
| Exchange#Binance#Account#main | TradeDate#12/17/2022 5:38:23 PM +02:00 | main    | Binance  |   0 | BNB         | BTCBUSD    |     0 | Spot        |  0.00086 | 2023-01-26T23:57:22.802+00:00 | 814746518 | 2023-01-26T23:57:23.429097+00:00  |
| Exchange#FTX#Account#main     | TradeDate#12/17/2021 5:38:23 PM +02:00 | main    | Binance  |   0 | BNB         | BTCBUSD    |     0 | Spot        |  0.00086 | 2023-01-26T23:57:23.252+00:00 | 814746521 | 2023-01-26T23:57:23.8756532+00:00 |
| Exchange#FTX#Account#main     | TradeDate#12/19/2022 4:59:12 PM +02:00 | main    | Binance  |   0 | BNB         | BTCBUSD    |     0 | Spot        |  0.00086 | 2023-01-26T23:57:23.759+00:00 | 814746524 | 2023-01-26T23:57:24.3824745+00:00 |
+-------------------------------+----------------------------------------+---------+----------+-----+-------------+------------+-------+-------------+----------+-------------------------------+-----------+-----------------------------------+

用户转账(存款+取款)

+-------------------------------+-------------------------------------------+---------+--------------------------------------------+------------+----------+------------+---------+-----------+----------------+--------------------------------------------------------------------+---------------------------+----------------------------------+--------------+------------------------------+
|              PK               |                    SK                     | Account |                  Address                   | AddressTag | Exchange | Instrument | Network | Quantity  | TransactionFee |                           TransactionId                            |       TransferDate        |            TransferId            | TransferType |          UpdatedAt           |
+-------------------------------+-------------------------------------------+---------+--------------------------------------------+------------+----------+------------+---------+-----------+----------------+--------------------------------------------------------------------+---------------------------+----------------------------------+--------------+------------------------------+
| Exchange#Binance#Account#main | TransferDate#12/17/2022 4:59:12 PM +02:00 | main    | 0xF76d3f20bF155681b0b983bFC3ea5fe43A2A6E3c | null       | Binance  | USDT       | ETH     | 97.500139 |            3.2 | 0x46d28f7d0e1e5b1d074a65dcfbb9d90b3bcdc7e6fca6b1f1f7abb5ab219feb24 | 2022-12-17T16:59:12+02:00 | 1b56485f6a3446c3b883f4f485039260 |            0 | 2023-01-28T20:19:59.9181573Z |
| Exchange#Binance#Account#main | TransferDate#12/17/2022 5:38:23 PM +02:00 | main    | 0xF76d3f20bF155681b0b983bFC3ea5fe43A2A6E3c | null       | Binance  | USDT       | ETH     | 3107.4889 |            3.2 | 0xbb2b92030b988a0184ba02e2e754b7a7f0f963c496c4e3473509c6fe6b54a41d | 2022-12-17T17:38:23+02:00 | 4747f6ecc74f4dd8a4b565e0f15bcf79 |            0 | 2023-01-28T20:20:00.4536839Z |
| Exchange#FTX#Account#main     | TransferDate#12/17/2021 5:38:23 PM +02:00 | main    | 0x476d3f20bF155681b0b983bFC3ea5fe43A2A6E3c | null       | FTX      | USDT       | ETH     |        20 |            3.2 | 0xaa2b92030b988a0184ba02e2e754b7a7f0f963c496c4e3473509c6fe6b54a41d | 2021-12-17T17:38:23+02:00 | 4747f6ecc74f4dd8a4b565e0f15bcf79 |            0 | 2023-01-28T20:20:00.5723855Z |
| Exchange#FTX#Account#main     | TransferDate#12/19/2022 4:59:12 PM +02:00 | main    | 0xc46d3f20bF155681b0b983bFC3ea5fe43A2A6E3c | null       | FTX      | USDT       | ETH     |        15 |            3.2 | 0xddd28f7d0e1e5b1d074a65dcfbb9d90b3bcdc7e6fca6b1f1f7abb5ab219feb24 | 2022-12-19T16:59:12+02:00 | 1b56485f6a3446c3b883f4f485039260 |            0 | 2023-01-28T20:20:00.5207119Z |
+-------------------------------+-------------------------------------------+---------+--------------------------------------------+------------+----------+------------+---------+-----------+----------------+--------------------------------------------------------------------+---------------------------+----------------------------------+--------------+------------------------------+
public async Task<UserTransferDto?> GetLastAsync(string exchange, string account)
{
    var queryRequest = new QueryRequest
    {
        TableName = TableName,
        KeyConditionExpression = "#pk = :pk",
        ExpressionAttributeNames = new Dictionary<string, string>
        {
            { "#pk", "PK" }
        },
        ExpressionAttributeValues = new Dictionary<string, AttributeValue>
        {
            { ":pk", new AttributeValue { S = $"Exchange#{exchange}#Account#{account}" } }
        },
        ScanIndexForward = false,
        Limit = 1
    };

    var response = await _dynamoDb.QueryAsync(queryRequest);
    if (response.Items.Count == 0)
    {
        return null;
    }

    var itemAsDocument = Document.FromAttributeMap(response.Items[0]);
    return JsonSerializer.Deserialize<UserTransferDto>(itemAsDocument.ToJson());;
}

一点编辑:

我意识到我也需要传输类型,因此我将 SK 更改为 TransferType#Withdraw#TransferDate#2022-12-17 14:59:12

现在代码如下:

public async Task<UserTransferDto?> GetLastAsync(string exchange, string account, TransferType transferType)
{
    var queryRequest = new QueryRequest
    {
        TableName = TableName,
        KeyConditionExpression = "#pk = :pk and begins_with(#sk, :sk)",
        ExpressionAttributeNames = new Dictionary<string, string> { { "#pk", "PK" }, { "#sk", "SK" } },
        ExpressionAttributeValues = new Dictionary<string, AttributeValue>
        {
            { ":pk", new AttributeValue { S = $"Exchange#{exchange}#Account#{account}" } },
            { ":sk", new AttributeValue { S = $"TransferType#{transferType}" } }
        },
        ScanIndexForward = false,
        Limit = 1
    };

    var response = await _dynamoDb.QueryAsync(queryRequest);
    if (response.Items.Count == 0)
    {
        return null;
    }

    var itemAsDocument = Document.FromAttributeMap(response.Items[0]);
    return JsonSerializer.Deserialize<UserTransferDto>(itemAsDocument.ToJson());
}

最佳答案

我个人的态度 - 在以下情况下不会改变任何事情:

  1. 现在可以使用
  2. 我没有发现我的系统存在任何 future 风险
  3. 性能/耐用性/维护/易于支持方面没有任何好处

对于你的问题,我不明白合并两个表对你有什么帮助。

我质疑您的表结构无法帮助您涵盖这些查询:

  • 获取给定交易所的最后一次用户转账和帐户名称。
  • 按日期范围获取所有用户交易。
  • 按日期范围获取所有用户转移。

如果我理解正确的话,你不需要通过当前的 PK 查询任何内容 => 你为什么选择这个 PK?当然,您可以通过使用 GSI 来解决它,但您不会免费获得它们,如果您可以重组您的表以使您的 3 个查询更容易,我会这样做。

希望我回答了你的问题。祝你好运,玩得开心)

关于c# - 单表设计 - DynamoDB - 将两个表合并为一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75274769/

相关文章:

amazon-web-services - S3 存储桶能否生成自己的对象键名称?

c# - WPF上下文菜单,复制菜单项变灰

c# - 查找 POST 参数

.net - Oracle.Dataaccess 错误 ORA-06502 : PL/SQL: numeric or value error: character string buffer too small

amazon-web-services - 如何将 S3 存储桶的特定文件夹的内容复制到不同 S3 存储桶的另一个特定文件夹

javascript - AWS S3 - CORS 选项预检在使用 VersionId 删除期间抛出 400 错误请求

c# - 从数组中捕获字符串

c# - 如何在 Metro 应用程序中打印文本文件或文本框的内容?

c# - Winforms 上的 SQL 更新语句

css - 基于 View (子页面)在 Layout.cshtml 中使用不同的 css 类渲染 <body> 标签?