我有一个基本上有3个对象的应用程序:
用户,公司,用户可以属于公司的地址,公司对象可以包含多个地址,而地址对象可以包含一个或多个属于它的用户。
从一个mangodb,nosql设计中,什么会更有效率,以便应用程序可以列出属于公司的所有用户以及地址?
目前,我的用户文档如下:
> db.users.find().pretty()
{
"__v" : 1,
"_id" : ObjectId("532b039c17fc6100001a8737"),
"active" : true,
"email" : "norman@khine.net",
"groups" : "member",
"lockUntil" : 0,
"loginAttempts" : 0,
"name" : "Norman Khine",
"password" : "$2a$10$EqptX.RRmsk0.FgFRJOpYe9swH0y.lBrgUsg/IatxErjYPm9bT4yq",
"provider" : [
"github",
"local"
],
"surname" : "",
"tokenExpires" : 1395418101786,
"tokenString" : "xX-gA29ep27Yv_Cg3OHxLLSfURfVYnAloEncWsJeOf3Er8HvoVWaSvCSSddRFHQY"
}
拥有:
会更好吗?"公司":[" _id"," _id" ...]#这种方式用户可以属于一个或多个公司 "地址":[" _id"," _id" ...]#这样用户可以属于一个或多个地址
或者我应该将每个user_id放在"公司"和"地址"模式?
任何建议都非常感激。
答案 0 :(得分:1)
嗯,它只取决于您的应用程序用于正常加载的内容。如果您的应用程序非常以用户为中心,则引用(*)用户文档中的公司和地址。如果您通常显示公司信息,请参考公司中的用户。如果你有一个以地址为中心......好吧,我想你知道我的意思;)
(*)NoSQL数据库中的引用可能会影响性能。这就是名为“预加盟”的原因。简单地将数据放在一起,您一次需要大部分时间。 简单示例:如果您在应用程序中显示用户信息,您很可能还需要在屏幕上显示他正在工作的公司名称。如果您只引用该公司,则需要额外查找该公司才能获得该公司的名称。现在的想法是将关于公司的参考文献与最需要的数据一起放入用户的文档中。或者 - 如果您只有与用户有关的公司,公司信息将永远不会自行维护,那么只需将整个公司数据放入用户的文档中即可。然后MongoDB将确保您可以加载文档而无需额外的磁盘查找。
如果您的文档中有很多引用,则很可能是对文档结构进行重新设计的一个标志。 :)