我正在将数据库从mysql转换为mongdb。我的问题是关于查找表。假设我有一个可以有多个类别的食谱。在mysql中,这是通过配方和类别表之间的多对多查找来实现的。在mongodb中,我可以简单地使用包含一系列类别的类别字段的食谱集合。文本实际上存储在该字段中,未被引用,如下所示:
recipe: {
_id: xxxxx,
title: "a recipe title",
categories: ['catone', 'cattwo']
}
那么,这是最佳做法吗?我更喜欢这种方法,因为它似乎比单独的集合更容易维护并引用它。但我看到两个缺点。一,如果类别名称发生变化,则必须更新所有记录,而不是像在mysql中那样更新单个查找记录。其次,在接口上的复选框列表中获取可用类别列表似乎效率低下。
我知道其他许多人不得不处理这个问题,所以我只是想找到最佳实践。
答案 0 :(得分:4)
你说的是对的。只要类别名称发生更改,您就必须更新(查找和修改)嵌入的类别。这是你的电话。您必须根据
等事实做出决定根据您的情况,在制作中我认为类别名称不会经常更改。它应该很少发生,所以我建议你嵌入它并有机制来更新它,但不是直接嵌入类别,我会嵌入Id如下。否则,当您想要更新并且必须在订单更新时进行字符串搜索时,这将是性能问题。如果你有id,你也可以有这个索引。
所以就像这样
recipe: {
_id: xxxxx,
title: "a recipe title",
categories: [{ id: 1,'catone'}, {id:2,'cattwo'}]
}
此外,当你有数百万或几十亿条记录要更新时,你必须看看你将如何处理。在某些情况下,您必须更新数百万条记录,而不仅仅是在一个集合中,而是在多个集合中。如果你有这种情况,那么你必须使用单独的更新服务或类似的东西来处理它。因为如果你试图同步,它将花费很多时间,你不希望你的用户等待这一切完成。
还要记住嵌入式阵列不能很长,就像拥有数百/数千个项目一样。 Mongo仍然允许它,但你会遇到问题。还需要考虑的另一个问题是,在创建数组之后是否会将其他类别添加到数组中。如果在更新中添加了很多其他项目,如果它会有很多,那么很多人都想了解Padding Factor。希望这会有所帮助。