我對NoSQL和DynamoDB非常陌生,我習慣於RDBMS。我正在爲遊戲設計數據庫,並且我們正在使用DynamoDB和AWS Lambda作爲後端。我爲包含用戶信息和資源的播放器配置文件創建了一個表名「用戶」。由於遊戲具有庫存系統,我還創建了一個表名「UserItems」。DynamoDb表設計:單表或多表
直到我意識到DynamoDB沒有事務,並且在兩個表上執行的任何操作(例如,使用增加資源的項)在一個表上有成功失敗的可能性時,缺少影響我們客戶的數據。
所以我在想也許我的多表設計並不好,因爲我在使用RDBMS時設計多個表是一種習慣。這讓我想到在「用戶」中存儲整個「UserItems」作爲散列,但我不確定這是否是一種好的做法,因爲Users表中單個行的大小將非常大(我們可能有500個唯一項每個用戶),每次我從/向「用戶」提取/放置數據時(大部分時間不需要「用戶項目」數據),讀/寫吞吐量也將非常大。
我應該怎麼做,保持多個表的設計和手動處理交易或切換到單表設計?或者也許有第三種選擇?
更新:我的使用情況的詳細信息
目前,我有2個表
- 用戶:用戶ID(鍵),用戶名,黃金
- UserItems:用戶ID(分區鍵) ItemId(排序鍵),名稱,GoldValue
方案:
- 用戶購買一個項目:Users.Gold將被推斷,新的UserItem將被添加到UserItems表中。
- 用戶出售一個項目:Users.Gold將增加,Item將從UserItems表中刪除。
在上述兩種情況下,我將不得不對2個表進行2次更新操作,如果沒有事務,則有可能其中一個失敗。
爲了解決這個問題,我考慮使用單表解決方案,這是一個單用戶表,包含4列UserId(key),Username,Gold和UserItems。但有兩件事我很擔心:
- UserItems中的數據對於單個單元格可能會很大,因爲一個用戶最多可能有500個項目。
- 添加/刪除項目我必須從dynamodb中添加UserItems,添加/刪除項目,然後將其放回到用戶中。所以我必須爲1個動作進行1次讀取和1次寫入操作。由於問題(1),讀/寫數據大小可能變得非常大。
感謝您的回答。看來單桌是我用例的解決方案。儘管如此,我仍然擔心單行內的數據大小以及將所有內容存儲在單個表中時的讀/寫過程。我已經更新了我的問題。我希望它能幫助你理解我的情況。 –
https://aws.amazon.com/blogs/developer/performing-conditional-writes-using-the-amazon-dynamodb-transaction-library/ –
不幸的是,我使用NodeJs進行Lambda,並且沒有事務庫JS呢。 –