MongoDB架构设计适用于可嵌入或独立的文档

时间:2012-04-01 21:52:03

标签: ruby-on-rails mongodb mongoid nosql

我是MongoDB的新手,我仍然习惯于架构设计。

在我目前正在处理的项目中,用户可以标记他们上传的文件。标签有三种类型:描述性,品牌和商店部门。它们被呈现为用户的三个字段,但实际上它们被合并在一起并保存为标签,即:

"tags" : [
  {
    "type" : "descriptive",
    "tag" : "this is my tag"
  },
  {
    "type" : "brand",
    "tag" : "this is another tag"
  }
]

这是为了使搜索变得非常容易。通过使用类型,我可以向用户呈现三个不同的字段,以鼓励他们提供信息,然后允许更高级的查询,例如品牌或商店部门的搜索。默认搜索只会搜索匹配的标记。

问题是我在所有字段中都提供了自动填充功能。当用户在“品牌”字段中键入时,显示所有创建的“品牌”类型的标签,以匹配其输入。这可以通过独立标签集合轻松实现。保存文件文档时,将创建并更新新标记文档。自动完成查询针对独立标记集合而不是嵌入式标记以提高性能。

这种设计有些不对劲。在某些方面,这是一种重复的努力,但就用户体验而言似乎工作得很好。我使用Mongoid并且为了适应这种设计,必须为我的标签集合创建两个模型。一个定义了两个属性,另一个从第一个继承,但添加了embedded_in宏。

我可以看到这种模式在其他情况下也很有用:产品和购物车,产品和采购订单等。有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

  

这种设计有些不对劲。在某些方面,这是一种重复的努力,但就用户体验而言似乎效果很好。

在NoSQL数据库中,有时必须进行非规范化。这将导致一些数据重复。但是,由于它可以大大提高性能(并且非常适合用户体验),这应该是值得的。

因此,具有用于自动完成的不同标记名称的集合可能是有意义的。它将比嵌入文档中的非不同标记小得多。这种方法没有错。

这个“主”集合将是为标签添加额外元数据的好地方,例如Stackoverflow对于标签的描述和维基。

此外,如果只有少数几种类型,为每种类型的标记设置单独的字段可能会更好。这样,您可以单独索引它们。

"tags" : { "descriptive: [ "this is my tag" ],
           "brand": ["this is another tag" ] }