首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >蒙古猫鼬数据桥接混乱

蒙古猫鼬数据桥接混乱
EN

Stack Overflow用户
提问于 2014-03-08 04:23:00
回答 2查看 82关注 0票数 0

从关系数据库设计过渡到“非关系数据库”一直是有趣的。

不管怎么样,

我已经建立了以下猫鼬模型:UserCompaniesJobsApplications

当用户申请职务时,他们的应用程序与作业相关联。

因此,一种方法是在工作中嵌套对应用程序的引用:

代码语言:javascript
复制
var JobSchema = new Schema({
    title: String,
    description: String,
    applications: [{ type: Schema.ObjectId, ref: 'Applications' }]
});

并在应用程序上存储对用户和作业的引用:

代码语言:javascript
复制
var Application = new Schema({
    resumeFile: String
    user: { type: Schema.ObjectId, ref: 'User' }
    job: { type: Schema.ObjectId, ref: 'Job' }
});

很好,找任何工作的申请人都是很简单的。

,然后是下面的问题,我如何获得用户的申请者?

我还必须将应用程序存储在用户上:

代码语言:javascript
复制
var User = new Schema({
    name: String
    email: String
    applications: [{ type: Schema.ObjectId, ref: 'Applications' }]
});

但是,现在-如果应用程序文档被删除(无论出于什么原因),我仍将在作业文档和用户文档中“引用”该文档。所以我需要找到用户和工作,获得两个文档.找到正确的推荐人..。从嵌套数组中删除它们..。然后再次保存两个文档。

与带有表联接的关系数据库相比,这似乎是非常荒谬的,因为在关系数据库中,甚至不存在这种引用胡说八道。联想是隐含的。

所以我在想,这是唯一的办法吗?(故意反问,但我没有更好的解决办法)。

我们非常感谢你的建议和答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-08 08:00:08

就我个人而言,我可能会将其作为一个嵌入式模式使用,因为它可能适合您的使用模式。以下几点:

  • 应用程序作为数组。好吧,经过一番考虑,谁会有100,甚至1000的申请。即使如此,它们真的都需要保留吗?
  • 简要介绍了嵌入作业的。这似乎会被显示很多,所以似乎值得保留正在使用的东西嵌入。
  • 作业详细信息作为链接对象。作业(或广告)可能有更多的信息,但在为用户显示摘要时不需要这些信息。因为所有的文档Id都在那里,所以仍然可以提取链接的作业。
  • 反向应用。不需要将关联的应用程序存储在作业上,用户到作业的关联就存在于用户上。所以您仍然可以获得所有的应用程序,尽管是在一个单独的查询中。

代码语言:javascript
复制
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的所有查询。但是,一般的模型仍然是摆脱了一个非典型的“多对多”的模型案例。把事情弄平一点。

正如智者所说:“你必须忘却你所学的东西”,年轻的学徒。拥抱一个新世界,而不是固守旧世界。但是如果它不适合你的项目,那么它就不是正确的工具。

票数 1
EN

Stack Overflow用户

发布于 2014-03-08 04:43:15

与带有表联接的关系数据库相比,这似乎非常荒谬,甚至不存在这种引用胡说八道。联想是隐含的。

Mongodb不是关系数据库,您不能期望一个非关系数据库的行为像关系数据库,所以是的,您需要手动清理您的数据,或者按预期使用mongodb,这意味着将应用程序嵌入到作业文档中,并从用户中删除对应用程序的任何引用。

现在,一些ODM (如PHP中的Mongo )将为您处理清理工作,因为您可以在代码中应用“约束”和级联删除、更新等.猫鼬不会那么做的。

如果您的数据是关系型的,请不要使用MongoDB,特别是如果您正在编写的平台上没有任何框架能够为您处理关系的话。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22264999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档