2012-04-01 51 views
0

我是相对较新的MongoDB,我仍然习惯于模式设计。MongoDB模式设计的文档,可以嵌入或独立

在我目前正在开发的一个项目中,用户可以标记他们上传的文件。有三种类型的标签:描述性,品牌和store_department。他们以三个领域的用户,但实际上它们合并到一起,并保存为标签,即:

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

这是为了使搜索很容易。通过使用一种类型,我可以向用户展示三个不同的字段,以鼓励他们提供信息,然后允许进行更高级的查询,例如品牌或商店部门搜索。默认搜索将只搜索匹配的标签。

问题是我在所有字段中提供了自动完成功能。当用户在“品牌”字段中键入时,所有创建的“品牌”类型的标签都会显示出来,以匹配他们的输入。这很容易通过独立标签集合来完成。在保存文件文档时创建并更新新的标签文档。针对独立标签集合的自动完成查询,而不是嵌入式标签的性能。

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

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

回答

0

这种设计有些不舒服。这在某些方面是重复努力,但就用户体验而言似乎很有效。

在NoSQL数据库中,您有时需要非规范化。这会导致一些数据重复。但是,因为它可以大大提高性能(并且对用户体验而言非常有用),所以这应该值得。

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

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

另外,如果只有几种类型,最好为每种类型的标签分别设置一个字段。这样,你可以分别索引它们。

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