Избегайте нескольких транзакций в рамках одного выполнения при обновлении сущностей в MongoDB - PullRequest
0 голосов
/ 02 апреля 2020

Я работаю с 2 коллекциями MongoDB, Recipe и Menu. Один Menu является комбинацией Recipe. Обратитесь к приведенному ниже сегменту кода для получения дополнительной информации

@Document
public class Recipe {
   private String id;
   private String name;
   private String description;

   // getter and setter
}

@Document
public class Menu {
   private String id;
   private String name;
   private List<RecipeItem> recipeItem;

   // getter and setter
}

public class RecipeItem {
   private String id;
   private String name;
   private String description;

   // getter and setter
}

RecipeItem - просто копия объекта Recipe, который указан в коллекции Menu

Когда Menu коллекция сохранена, вы можете добавить рецепты в меню и, следовательно, список Recipe объектов также будет сохранен в коллекции Menu на имя RecipeItem. Когда любой из Recipe обновляется, соответствующий RecipeItem, который находится в Menu, также должен быть обновлен. В противном случае рецепт в Меню устареет по сравнению с текущим Recipe после обновления. Поэтому я должен выполнить итерацию коллекции Menu, которая содержит обновленный Recipe на Id и должна обновить информацию рецепта в коллекции Menu.

Таким образом, функция обновления Menu инициирует несколько транзакции в рамках одного выполнения, и поэтому нам также необходим механизм отката. Поэтому я не очень люблю этот подход.

Я новичок в MongoDB, и я хочу проверить, является ли текущий дизайн базы данных Menu и Recipe правильным или неправильным? Если да, что будет оптимальным способом сделать это? Я знаю, что можно использовать ссылку на БД между коллекциями, но это влияет на производительность.

1 Ответ

0 голосов
/ 02 апреля 2020

В документе Menu должен храниться список идентификаторов Recipe s, а не сами рецепты. Тогда вы можете отказаться от RecipeItem и использовать Recipe напрямую.

Кажется более разумным, что Recipe состоит из RecipeItems (яблочный пирог состоит из муки, сахара, яиц, яблок и т. Д. c.).

В любом случае ссылка устранит необходимость держать два списка в синхронизации c.

...