Как сохранить документы с двумя ключами разделения в синхронизации / ссылочной целостности? - PullRequest
0 голосов
/ 01 июля 2019

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

например, это документ:

{
“id”:”guid”,
“title”:”Example document to share”,
“ownerUserId”:”user1Guid”,
“type”: “usersDocument”,
“partitionKey”:”user_user1Guid_documents”
}

Теперь пользователь хочет поделиться этим документом с другим пользователем.

Предположения:

  1. одним документом могут поделиться многие пользователи (тысячи)
  2. один пользователь может поделиться с ним тысячами документов

По этим двум причинам:

  1. Я не хочу вставлять разделы в document документы или в user документы (поскольку записи очень скоро станут неэффективными / дорогостоящими), но я бы предпочел, чтобы эти m:n были отдельными документами.
  2. Я не хочу размещать акции для всех пользователей / документов, так как это очень скоро создаст горячие точки

Мне нужны оба запроса:

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).

Как сохранить это «атомарным» или избежать создания / обновления аномалий?

Или есть ли лучший способ смоделировать это?

1 Ответ

1 голос
/ 03 июля 2019

Я думаю, что ваш метод имеет смысл, я делаю что-то похожее на разделение несколькими способами в зависимости от объема запроса. Я предполагаю, что ваша основная проблема заключается в том, произошел ли сбой между сохранением первого и последнего набора связанных документов? К сожалению, единственный способ управлять цепочкой документов при их сохранении - это код вашего приложения. мы сохраняем в том порядке, в котором проще всего выполнить откат, а затем реализуем метод отката в обработчике исключений, это работает путем сохранения сохраненных документов коллекции в памяти.
Как вы говорите, когда вы пересекаете разделы, нет обработки транзакций из коробки.

...