有关MongoDB架构设计的建议

时间:2013-06-16 18:51:20

标签: mongodb schema database nosql

我正在为将使用mongodb和spring-data的应用程序设计db模式。我对NoSQL数据库很陌生,并且遇到了以下设计问题:

该应用程序将有三个简单的域对象:UsersNotesTags。用户可以拥有多个Notes(1:n),并且每个Note都使用一个或多个标签(n:m)进行注释。

现在我的问题是,我无法弄清楚设计Notes和标签之间的一对多关系的最佳方法是什么。

主要用例是通过带注释的标签查询用户的注释。所以我的第一个方法是将标签嵌入Notes中。我可以在这里处理冗余,因为我真的想要快速读取操作,并且通常不会发生Notes和/或标签的更新。然而,我还需要查询用户的所有标签列表(即,在按标签搜索Notes时实现预先输入功能)。

目前我的Note文档看起来像这样:

{
   "id":"51bcf4a97aecbafaf5e79713",
   "label":"Label of the Note",
   "contents":"Contents of the Note",
   "owner":"username",
   "tags":[
      {     
         "name":"Tag1",
         "type":"default"
      },
      {     
         "name":"Tag2",
         "type":"default"
      }
   ]
}

我的主要问题是:

  • 如果我选择嵌入,那么有效查询用户所有标签列表的最佳方式是什么(没有重复)?
  • 在此设置中使用嵌入是否更好?然后,我如何查询所有使用某些标记列表注释的Notes? (这有可能吗?)

1 个答案:

答案 0 :(得分:2)

我建议您按照描述存储备注,并在用户文档中另外存储所有使用过的标签。请记住,MongoDB中的数据冗余是可以接受的,并且通常是最好的方法,因为您应该为读取而不是写入来设计模式。

然后在Java端,您只需将标签存储在Set中作为User类的属性,这样您就可以确保在那里存储唯一数据。