MongoDB - Поддерживать целостность данных автоматически - PullRequest
3 голосов
/ 26 января 2011

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

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

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

А потом документ с заданием ...

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

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

Ответы [ 2 ]

4 голосов
/ 26 января 2011

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

0 голосов
/ 26 января 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...