1

我目前正在为将使用 mongodb 和 spring-data 的应用程序设计数据库模式。我对 NoSQL 数据库很陌生,并且正在努力解决以下设计问题:

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

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

主要用例是通过带注释的标签查询用户的注释。所以我的第一个方法是在 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"
      }
   ]
}

我的主要问题是:

  • 如果我使用嵌入,那么有效查询用户所有标签列表(不重复)的最佳方法是什么?
  • 在此设置中使用引用而不是嵌入会更好吗?然后,我如何查询所有带有特定标签列表的注释?(这可能吗?)
4

1 回答 1

2

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

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

于 2013-06-24T21:55:53.157 回答