Как синхронизировать отношения «один ко многим» между хранилищем данных Amplify и DynamoDB?

#amazon-dynamodb #synchronization #offline #aws-amplify #datastore

#amazon-dynamodb #синхронизация #Не в сети #aws-amplify #хранилище данных

Вопрос:

Я работаю над приложением списка покупок с 2 моделями: список продуктов и список покупок. Список покупок содержит много продуктов, и продукт принадлежит одному списку покупок.

 # schema.graphql
type Product @model 
{
  id: ID!
  groceryList: GroceryList @connection(name: "GroceryListProducts")
  name: String!
}

type GroceryList @model {
  id: ID!
  name: String!
  products: [Product] @connection(name: "GroceryListProducts")
}
  

Насколько я понимаю, в DynamoDB отношение «один ко многим» может быть запрошено с помощью глобального вторичного индекса и не будет напрямую отображаться в записях DynamoDB:

Таблица списка покупок DynamoDB:

 ╔═══════╦═════════╗
║ Id    ║    Name ║
╠═══════╬═════════╣
║ L1    ║ List1   ║ 
║ L2    ║ List2   ║
║ L3    ║ List3   ║ 
╚═══════╩═════════╝
  

Таблица списка продуктов DynamoDB:

 ╔═════════╦═══════╦════════╗
║ Id      ║ Name  ║ PID*   ║
╠═════════╬═══════╬════════╣
║ O1      ║ Orange║ L1     ║
║ O2      ║ Apple ║ L1     ║
║ O3      ║ Bacon ║ L2     ║
╚═════════╩═══════╩════════╝
  

*ProductGroceryListId

Когда я добавляю продукт и сохраняю его в хранилище данных, как показано ниже:

       const productSaved = await DataStore.save(
        new Product(product)
      )
      await DataStore.save(
        GroceryList.copyOf(currentList, updated => {
          updated.products = [...updated.products, productSaved]
    }))
  

Экземпляр GroceryList в хранилище данных будет корректно отображать дочерние элементы products:

 // GroceryList item showing on the browser DevTools, tab Application, IndexDB, amplify DataStore:
{
 id: "L1"
 name: "List1"
 products: [
  {id: "01", groceryList: {…}, name: "Orange"},
  {id: "02", groceryList: {…}, name: "Apple"}
 ]
}
  

Однако, если я добавлю синхронизацию с облаком:

  const subscription = DataStore.observe(Product).subscribe(msg => {
        console.log(msg.model, msg.opType, msg.element);
})
  

Дочерние элементы исчезнут из экземпляра хранилища данных GroceryList.
Как я могу предотвратить это?

Я хотел бы убедиться, что могу использовать свое приложение как онлайн, так и офлайн.

Заранее благодарим вас за помощь!