mongodb - 更新 MongoDB 中的实体时,避免单次执行中的多个事务
问题描述
我正在使用 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
?如果是,那么最佳的做法是什么?我知道可以在集合之间使用数据库引用,但是会对性能产生影响。
解决方案
该Menu
文档应存储Recipe
s ID 的列表,而不是配方本身。然后就可以省去直接RecipeItem
使用了Recipe
。
Recipe
a由以下组成似乎更明智RecipeItems
(苹果馅饼由面粉、糖、鸡蛋、苹果等组成)。
在任何情况下,引用都会消除保持两个列表同步的需要。
推荐阅读
- javascript - 使用 express 在前端读取 Base64 图像
- c# - UWP查找全屏退出原因
- autodesk-forge - 从 Autodesk.Viewing.MarkupsCore 离开EditMode 不显示工具栏
- python - WebDriverException:消息:服务 /usr/bin/google-chrome 意外退出。状态代码是:-11 with ChromeDriver Chrome through Selenium Python
- typescript - Typescript 生成的 CssExports 接口:如何导入/编译?
- mysql - MySQL COUNT 未提供正确结果
- android - 单击适配器中的recyclerview项目时如何创建和打开对话框
- ansible - ansible 模块语法 - 什么 | 模块名之后是什么意思?
- java - Apache Karaf - CXF REST 服务器地址
- android - 特别是在 android 上的 SQLite 中,如果您更改构建它们的表的架构,是否需要“刷新”视图?