2011-01-25 2 views
3

Я заинтересован в переходе от реляционной БД к MongoDB для повышения производительности. Я бы сохранил избыточные, денормализованные данные в нескольких местах, и мне интересно, можно ли автоматически поддерживать целостность данных БЕЗ кода приложения.MongoDB - Автоматическое сохранение целостности данных

Например, если у меня есть документ пользователя ...

User: { _id: "...", userName: "johndoe", displayName: "John Doe", TotalTasks: 3 } 

А затем документ Task ...

Task: { _id "...", title: "Finish Reports", userID: "...", userName: "johndoe", userDiplayName: "John Doe" } 

Как я автоматически могу гарантировать, что имя пользователя и DISPLAYNAME остаются теми же в соответствующих документах? Как я могу гарантировать, что TotalTasks будет обновляться, когда новые задачи будут добавлены или удалены для этого пользователя?

+1

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

ответ

4

Вы не можете принудительно применять эти ограничения на стороне сервера. Однако триггеры - это то, что есть planned. Единственное ограничение, которое в настоящее время поддерживается, - это уникальные индексы.

+0

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

0

Невозможно обеспечить их соблюдение с помощью MongoDB без какого-либо внешнего кодирования приложения. Один из вопросов, который я хотел бы задать выше, заключается в том, почему задачи не являются частью пользовательского документа? Это позволит устранить проблему согласованности, так как вы сможете обрабатывать пользователя и задачу атомарно.

Однако, если вы не можете, то, что я делал в прошлом, это использование MySQL и поля версии для обеспечения согласованности. Каждое приложение отличается, но основной смысл таков:

1) каждый документ в Mongo имеет связанную строку в MySQL. Эта строка в MySql будет содержать коллекцию, идентификатор документа и некоторую информацию аудита (последнее изменение, кто изменился и т. Д.) 2) определить, какие документы необходимо блокировать, а затем создать сериализуемую транзакцию в mysql. 3) обновите записи в монго с помощью поиска и обновления и убедитесь, что поле версии соответствует обеспечению оптимистичного параллелизма. 4) если все завершено, то совершите транзакцию в mysql. 5) если что-то пойдет не так, откатите все выполненные операции в манго. Если откат не может быть завершен, перетащите информацию для отката в файл сообщения и выполните отдельный процесс, который «очистит». 6) откатить транзакцию mysql

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

+0

Быстрый вопрос: если вы должны были сделать все задачи частью пользовательского документа, означает ли это, что каждый раз, когда вам нужны атрибуты пользователя (но не фактические задачи), например, когда вы хотите получить адрес электронной почты пользователей отправьте электронное письмо, не приведет ли это к значительным накладным расходам, так как Mongo получит весь документ, включая, возможно, 1000 задач? Или даже просто выполнить запрос? – o1iver

+0

Если это проблема, я думаю, вы могли бы просто сохранить идентификаторы объектов всех задач в пользовательском документе, но тогда вам нужно будет выполнить два запроса для получения определенной задачи для определенного пользователя ... правильно? (Вполне возможно, что я ошибаюсь в обоих случаях, так как я только недавно играл с Монго) – o1iver

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