1

Я изучаю, использовать ли AWS DynamoDb или Azure DocumentDb или облако Google для цены и простоты для моего приложения, и мне интересно, какой лучший подход подходит для типичной схемы приглашения.Моделирование схемы приглашения со встроенными коллекциями с dynamodb или documentemntdb

инвайт имеет

  • USERID: ключ (который создал приглашение)
  • GameID: ключ
  • invitationList: коллекция UserIds

Запросы я бы бег

  1. Получить приглашения, где userId == я
  2. Get приглашает где мой идент в invitationList

В Монго, я бы просто установить индекс на встроенном invitationList, и в SQL я бы создал присоединиться таблицу GameID и пригласил UserIds ,

Использование dynamodb или documentdb, могу ли я сделать это в одной «таблице», или мне нужно будет создать вторую денормализованную таблицу, в которой есть приглашенный пользовательский указатель на строку с набором приглашенныхGameIds?

например.

Вторичный стол с

  • InvitedUserId: ключевые
  • GameIds: Коллекция

ответ

2

Как и в случае с ответом hslriksen, если определенные критерии выполнены, я рекомендую денормализовать все это в один документ. Этими критериями являются:

  1. Список приглашений для игр не может расти неограниченно.
  2. Даже если он ограничен, будет ли массив максимальной длины соответствовать документу и границам транзакций.

Однако, в отличие от hslriksen я рекомендую пример документ выглядит следующим образом:

{ 
    gameId: <some game key>, 
    userId: <some user id>, 
    invitationList: [<user id 1>, <user id 2>, ...] 
} 

Вы также можете решить, использовать встроенный в id поле для игры в этом случае имя выше неправильно.

Ключевое различие между тем, что я предлагаю и hslriksen, заключается в том, что приглашениеList представляет собой чистый массив внешних ключей. Это позволит использовать индексы для предложения ARRAY_CONTAINS в вашем запросе.

Обратите внимание, что в DocumentDB вы хотели бы хранить все типы сущностей в одном большом ведре и просто отличать их от строки type или немного лучше, с булевым полем is_my_type.

+0

будет ли это предложение ARRAY_CONTAINS эффективным, поскольку оно будет использовать индекс - или ему придется сканировать всю таблицу? – MonkeyBonkey

+0

ARRAY_CONTAINS будет использовать индекс, чтобы он был эффективным. Это основная причина моего изменения в том, что предлагает hslriksen. –

+0

- все встроенные массивы, индексированные по умолчанию в documentdb, или они должны быть явно заданы? – MonkeyBonkey

1

Для DocumentDB вы могли бы, вероятно, просто держать это в одном документе за приглашения пользователю где документ Id может равняться ключ приглашающего пользователя. Если у вас много игр, вы можете использовать gameId как partitionKey.

{ 
    "id" : "gameKey+invitingUserKey", 
    "gameKey" : "someGameKey", 
    "invitingUserId": "key", 
    "invites": ["inviteKey1", "inviteKey2"] 
} 

Это на основе ограниченного количества приглашений для пользователя/игры. Однако сложно определить структуру, не зная ваши шаблоны запросов. Я считаю, что шаблоны запросов часто диктуют структуру документа.

+0

Я обновил вопрос, включив в него типичные запросы. В этом случае, как я могу запустить запрос, чтобы получить все игры, на которые я приглашаю? Я не могу сделать указатель на пригласительныйUserId правильно? – MonkeyBonkey

+0

Исходя из этого, я бы использовал простой массив для приглашенияUserId. Я обновил свой ответ. Это более или менее то же самое, что и у Ларри. – hsulriksen

 Смежные вопросы

  • Нет связанных вопросов^_^