我正在为将使用mongodb和spring-data的应用程序设计db模式。我对NoSQL数据库很陌生,并且遇到了以下设计问题:
该应用程序将有三个简单的域对象:Users
,Notes
和Tags
。用户可以拥有多个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"
}
]
}
我的主要问题是:
答案 0 :(得分:2)
我建议您按照描述存储备注,并在用户文档中另外存储所有使用过的标签。请记住,MongoDB中的数据冗余是可以接受的,并且通常是最好的方法,因为您应该为读取而不是写入来设计模式。
然后在Java端,您只需将标签存储在Set中作为User类的属性,这样您就可以确保在那里存储唯一数据。