从关系数据库设计过渡到“非关系数据库”一直是有趣的。
不管怎么样,
我已经建立了以下猫鼬模型:User、Companies、Jobs和Applications。
当用户申请职务时,他们的应用程序与作业相关联。
因此,一种方法是在工作中嵌套对应用程序的引用:
var JobSchema = new Schema({
title: String,
description: String,
applications: [{ type: Schema.ObjectId, ref: 'Applications' }]
});并在应用程序上存储对用户和作业的引用:
var Application = new Schema({
resumeFile: String
user: { type: Schema.ObjectId, ref: 'User' }
job: { type: Schema.ObjectId, ref: 'Job' }
});很好,找任何工作的申请人都是很简单的。
,然后是下面的问题,我如何获得用户的申请者?
我还必须将应用程序存储在用户上:
var User = new Schema({
name: String
email: String
applications: [{ type: Schema.ObjectId, ref: 'Applications' }]
});但是,现在-如果应用程序文档被删除(无论出于什么原因),我仍将在作业文档和用户文档中“引用”该文档。所以我需要找到用户和工作,获得两个文档.找到正确的推荐人..。从嵌套数组中删除它们..。然后再次保存两个文档。
与带有表联接的关系数据库相比,这似乎是非常荒谬的,因为在关系数据库中,甚至不存在这种引用胡说八道。联想是隐含的。
所以我在想,这是唯一的办法吗?(故意反问,但我没有更好的解决办法)。
我们非常感谢你的建议和答案。
发布于 2014-03-08 08:00:08
就我个人而言,我可能会将其作为一个嵌入式模式使用,因为它可能适合您的使用模式。以下几点:
var jobDetailSchema = new Schema({
// All the details of the job
});
var applicationSchema = new Schema({
resumeFile: String,
job: {
title: String,
shortDescription: String,
jobDetail: { type: Schema.ObjectId, ref: 'JobDetail' }
}
},{ _id: false});
var userSchema = new Schema({
name: String,
email: String,
applications: [applicationSchema]
});
var User = mongoose.model( "User", userSchema );
var JobDetail = mongoose.model( "JobDetail", jobDetailSchema );因此,是的,这与关系方法不同,但这不是关系数据存储。
如果一份工作有问题,你需要做些清理吗?是的,但这并不是太多的维护,即使链接消失了,也不应该是件痛苦的事。是否仅仅因为“职务”已被删除,就想失去应用程序的详细信息?也许不会,所以这或多或少是正确的。
如果整个应用程序嵌入的东西太让您害怕,那么可以继续使用引用,并覆盖调用populate的所有查询。但是,一般的模型仍然是摆脱了一个非典型的“多对多”的模型案例。把事情弄平一点。
正如智者所说:“你必须忘却你所学的东西”,年轻的学徒。拥抱一个新世界,而不是固守旧世界。但是如果它不适合你的项目,那么它就不是正确的工具。
发布于 2014-03-08 04:43:15
与带有表联接的关系数据库相比,这似乎非常荒谬,甚至不存在这种引用胡说八道。联想是隐含的。
Mongodb不是关系数据库,您不能期望一个非关系数据库的行为像关系数据库,所以是的,您需要手动清理您的数据,或者按预期使用mongodb,这意味着将应用程序嵌入到作业文档中,并从用户中删除对应用程序的任何引用。
现在,一些ODM (如PHP中的Mongo )将为您处理清理工作,因为您可以在代码中应用“约束”和级联删除、更新等.猫鼬不会那么做的。
如果您的数据是关系型的,请不要使用MongoDB,特别是如果您正在编写的平台上没有任何框架能够为您处理关系的话。
https://stackoverflow.com/questions/22264999
复制相似问题