我有以下服装: -
用户可以登录网站。用户可以添加/删除轮询(具有两个选项的问题)。任何用户都可以通过选择任何一个选项来对投票给出意见。
考虑到上述情况,我有三个模型 - Users
Polls
Options
。它们如下 -
var usersSchema = new Schema({
username : {
type : String,
required : true
},
email : {
type : String,
required : true,
unique : true
},
password : String,
polls : [pollSchema]
});
var pollSchema = new Schema({
question : {
type : String,
required : true
},
options : [optionSchema]
});
var optionSchema = new Schema({
optionName : {
type : String,
required : true,
},
optionCount : {
type : Number,
default : 0
}
});
如何在这些文档之间实现上述关系。猫鼬人口有什么特别之处?它与子文档有什么不同?我应该使用子文档还是应该使用Mongoose人口。
答案 0 :(得分:4)
由于MongoDb没有作为关系数据库加入,所以人口就像隐藏连接一样。这只是意味着当你拥有那个用户模型并且你将填充Poll Model时,mongoose会做这样的事情:
当您将User设置为文档并将Polls设置为子文档时,这只意味着您将整个数据放在单个文档中。一方面意味着要获取用户轮询,mongoose不需要运行两个查询(它只需要获取用户文档,因为已经存在轮询数据)。
如果您的民意调查文件将在其他文件中提及(您需要访问来自文档用户,A,B,C的民意调查 - 最好填充它,但不能确定。填充的好处是事实,即您将需要更改一些民意调查字段,您不需要在每个引用该民意调查文档的文档中更改该数据(因为它将是一个子文档) - 在这种情况下,在文档User,A,B中, C - 你只会更新民意调查文件。正如你所看到的那样好。我告诉它不确定在这种情况下填充是否会更好,因为我不知道你需要怎样检索您的民意调查数据。如果您以错误的方式存储数据,您将遇到性能问题或在轻松获取数据时遇到一些问题。
子文档是存储数据的基本方法。当民意调查只涉及用户时,这很棒。有性能优势 - mongoose需要一个查询而不是两个查询,因为你只在一个地方存储了Polls数据,所以不需要更新其他文档。
基本上创建MongoDb主要使用Subdocuments。事实上,它只是非关系型数据库。所以在大多数情况下我更喜欢使用子文档。在我的情况下,我无法回答哪种方式会更好,因为我不确定您的数据库的外观(完整方式)以及您希望如何检索数据。
官方文档中有一些有用的信息:
看一看。
由于我更喜欢轻松获取数据,请注意性能并知道MongoDb中的数据冗余是常见的,我会选择将此数据存储为子文档。