什么是将mysql查找表转换为mongodb的最佳实践

kid*_*rax 5 mysql schema mongodb

我正在将数据库从mysql转换为mongdb。我的问题是关于查找表。假设我有一个可以包含多个类别的食谱。在mysql中,这是通过在配方和类别表之间进行多对多查找来实现的。在mongodb中,我可以简单地拥有一个食谱集合,其中包含一个包含一个类别数组的类别字段。文本实际上存储在该字段中,未引用,如下所示:

recipe: {
  _id: xxxxx,
  title: "a recipe title",
  categories: ['catone', 'cattwo']
}
Run Code Online (Sandbox Code Playgroud)

那么,这是最佳实践吗?我更喜欢这种方法,因为它似乎比单独的集合和引用起来更容易维护。但是我看到两个缺点。第一,如果类别名称更改,则必须更新所有记录,而不是像mysql中那样仅更新单个查找记录。其次,获取可用类别列表以用于界面上的复选框列表似乎效率不高。

我知道许多其他人必须处理此问题,因此我只是在尝试寻找被认为是最佳实践的方法。

Ana*_*lan 5

你说的是对的。每当类别名称更改时,您都必须更新(查找和修改)嵌入的类别。是你的电话。您必须根据以下事实做出决定

  • 类别名称在生产中会更改多少次
  • 您有多少个类别

根据您的情况,在生产中我认为类别名称不会频繁更改。它应该很少发生,因此我建议您嵌入它并具有更新它的机制,但是与其直接嵌入类别,不如下面嵌入Id。否则,当您要更新并且必须进行字符串搜索以进行更新时,这将是性能问题。如果您有ID,则也可以对此进行索引。

所以像这样

recipe: {
    _id: xxxxx,
    title: "a recipe title",
    categories: [{ id: 1,'catone'}, {id:2,'cattwo'}]
}
Run Code Online (Sandbox Code Playgroud)

另外,您还必须查看要更新几百万或数十亿条记录时如何处理。在某些情况下,您不仅要更新一个集合中的多个记录,还要更新多个集合中的数百万个记录。如果遇到这种情况,则必须使用单独的更新服务或类似的服务来处理。因为如果您尝试同步执行,将花费大量时间,并且您不希望用户等待所有这些完成。

还请记住,嵌入式阵列不能像拥有数百/数千个项目那样太长。Mongo仍然会允许它,但是您将面临问题。需要考虑的另一件事是在创建数组后是否将其他类别添加到数组。如果可以在更新中添加这么多其他项,那么如果要添加很多项,那么您很多人都想阅读有关填充因子的信息。希望这可以帮助。