У меня есть космическая база данных с синтетическими ключами разделов высокой мощности и свойствами типа.
Мне нужна настройка, где пользователи могут обмениваться документами между собой.
например, это документ:
{
“id”:”guid”,
“title”:”Example document to share”,
“ownerUserId”:”user1Guid”,
“type”: “usersDocument”,
“partitionKey”:”user_user1Guid_documents”
}
Теперь пользователь хочет поделиться этим документом с другим пользователем.
Предположения:
- одним документом могут поделиться многие пользователи (тысячи)
- один пользователь может поделиться с ним тысячами документов
По этим двум причинам:
- Я не хочу вставлять разделы в
document
документы или в user
документы (поскольку записи очень скоро станут неэффективными / дорогостоящими), но я бы предпочел, чтобы эти m:n
были отдельными документами.
- Я не хочу размещать акции для всех пользователей / документов, так как это очень скоро создаст горячие точки
Мне нужны оба запроса:
1. ListDocumentsSharedWithMe
В этом запросе во время запроса я знаю, что id
из user
документов доступны для общего доступа.
2. ListAllUsersISharedThisDocumentWith
В этом запросе во время запроса я знаю know id of the
document that has been shared with different
users`.
Все это заставляет меня думать, что у меня должно быть 2 отдельных типа документов с отдельным разделом
Для просмотра всех документов, которыми я поделился:
{
“id”:”documentGuid”,
“type”:”sharedWithMe”,
“partitionKey”:”sharedWithMe_myUserGuid”
}
(это также может быть один документ с коллекцией общих документов. Важным здесь является partitionKey)
Теперь я могу легко сделать SQL как SELECT * FROM c WHERE c.type = “sharedWithMe”
и выполнить запрос к ключу раздела, содержащему мою инструкцию пользователя.
Для перечисления всех пользователей, которым я поделился каким-то документом, схожим с ним:
{
“id”:”userISharedWithGuid”,
“type”:”documentSharings”,
“partitionKey”:”documentShare_documentGuid”
}
Теперь я легко могу сделать SQL как SELECT * FROM c WHERE c.type = “documentSharings”
и выполнить запрос к ключу раздела, содержащему мой guid документа.
Вопрос:
Когда пользователь разделяет документ с каким-либо пользователем, оба документа должны создаваться с разными ключами разделения (таким образом, без sp / Transactions).
Как сохранить это «атомарным» или избежать создания / обновления аномалий?
Или есть ли лучший способ смоделировать это?