Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >mongo中的外键?

mongo中的外键?
EN

Stack Overflow用户
提问于 2011-06-13 17:40:35
回答 7查看 133.4K关注 0票数 114

如何在MongoDB中设计这样的方案?我想没有外键!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-06-13 17:46:33

您可能会对使用对象关系映射感兴趣,如Mongoid或MongoMapper。

http://mongoid.org/docs/relations/referenced/1-n.html

在像MongoDB这样的NoSQL数据库中,没有‘表’,而是集合。文档在集合中分组。您可以在单个集合中包含任何类型的文档和任何类型的数据。基本上,在NoSQL数据库中,如何组织数据及其关系是由您决定的。

Mongoid和MongoMapper所做的就是为您提供方便的方法来非常容易地建立关系。查看我给你的链接,并提出任何问题。

编辑:

在mongoid中,你可以这样写你的方案:

代码语言:javascript
运行
AI代码解释
复制
class Student
  include Mongoid::Document

    field :name
    embeds_many :addresses
    embeds_many :scores    
end

class Address
  include Mongoid::Document

    field :address
    field :city
    field :state
    field :postalCode
    embedded_in :student
end

class Score
  include Mongoid::Document

    belongs_to :course
    field :grade, type: Float
    embedded_in :student
end


class Course
  include Mongoid::Document

  field :name
  has_many :scores  
end

编辑:

代码语言:javascript
运行
AI代码解释
复制
> db.foo.insert({group:"phones"})
> db.foo.find()                  
{ "_id" : ObjectId("4df6539ae90592692ccc9940"), "group" : "phones" }
{ "_id" : ObjectId("4df6540fe90592692ccc9941"), "group" : "phones" }
>db.foo.find({'_id':ObjectId("4df6539ae90592692ccc9940")}) 
{ "_id" : ObjectId("4df6539ae90592692ccc9940"), "group" : "phones" }

您可以使用该ObjectId来处理文档之间的关系。

票数 32
EN

Stack Overflow用户

发布于 2011-06-13 18:03:55

如何在mongodb中设计这样的表格?

首先,澄清一些命名约定。MongoDB使用collections而不是tables

我想没有外键!

采用以下模型:

代码语言:javascript
运行
AI代码解释
复制
student
{ 
  _id: ObjectId(...),
  name: 'Jane',
  courses: [
    { course: 'bio101', mark: 85 },
    { course: 'chem101', mark: 89 }
  ]
}

course
{
  _id: 'bio101',
  name: 'Biology 101',
  description: 'Introduction to biology'
}

显然,Jane的课程列表指向了一些特定的课程。数据库不会对系统应用任何约束(即:外键约束),因此没有“级联删除”或“级联更新”。但是,数据库确实包含正确的信息。

此外,MongoDB还提供了一个DBRef standard来帮助标准化这些引用的创建。事实上,如果你看一下这个链接,它有一个类似的例子。

如何解决此任务?

需要说明的是,MongoDB不是关系型的。没有标准的“范式”。您应该为您的数据库建模,使其适合您存储的数据和要运行的查询。

票数 71
EN

Stack Overflow用户

发布于 2017-05-08 11:05:24

我们可以在MongoDB中定义所谓的foreign key。但是,我们需要通过自己的来维护数据完整性。例如,

代码语言:javascript
运行
AI代码解释
复制
student
{ 
  _id: ObjectId(...),
  name: 'Jane',
  courses: ['bio101', 'bio102']   // <= ids of the courses
}

course
{
  _id: 'bio101',
  name: 'Biology 101',
  description: 'Introduction to biology'
}

courses字段包含课程的_id。定义一对多关系很容易。但是,如果我们想要检索Jane**,学生的课程名称,我们需要通过_id**.** _id**.**执行另一个操作来检索** course 文档

如果删除了课程bio101,我们需要执行另一个操作来更新student文档中的courses字段。

更多信息: MongoDB模式设计

MongoDB的文档类型特性支持以灵活的方式定义关系。要定义一对多关系:

嵌入式文档

  1. 适用于一对多。
  2. 的优势:不需要对另一个文档执行额外的查询无法管理嵌入式文档的实体individually.

示例:

代码语言:javascript
运行
AI代码解释
复制
student
{
  name: 'Kate Monster',
  addresses : [
     { street: '123 Sesame St', city: 'Anytown', cc: 'USA' },
     { street: '123 Avenue Q', city: 'New York', cc: 'USA' }
  ]
}

子引用

就像上面的student/course示例。

父引用

适用于一对多,如日志消息。

代码语言:javascript
运行
AI代码解释
复制
host
{
    _id : ObjectID('AAAB'),
    name : 'goofy.example.com',
    ipaddr : '127.66.66.66'
}

logmsg
{
    time : ISODate("2014-03-28T09:42:41.382Z"),
    message : 'cpu is on fire!',
    host: ObjectID('AAAB')       // Reference to the Host document
}

实际上,hostlogmsg的父对象。考虑到日志消息非常庞大,引用host id可以节省大量空间。

参考文献:

  1. 6 Rules of Thumb for MongoDB Schema Design: Part 1
  2. 6 Rules of Thumb for MongoDB Schema Design: Part 2
  3. 6 Rules of Thumb for MongoDB Schema Design: Part 3
  4. Model One-to-Many Relationships with Document References
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6334048

复制
相关文章
Cypress web自动化21-如何在多个tests之间共享cookies
Cypress 默认每个用例开始之前会清空所有的cookies,保证每个用例的独立性和干净的环境。 但是我们希望在一个js文件下写多个测试用例的时候,希望只调用一次登录, 记住cookies,后面的用例都默认是登录状态,这样测试的效率高一些。 实现cookies共享有2种实现方式
上海-悠悠
2020/05/29
1.9K0
多个Pod之间共享Volume以及详细配置
要在多个Pod之间共享Volume,可以使用Kubernetes的persistentVolumeClaim(PVC)来声明和访问共享的Volume。
一凡sir
2023/09/02
1.4K0
多个Pod之间共享Volume以及详细配置
如何优雅地解决多个 React、Vue 应用之间的状态共享
前言 人生是个积累的过程,你总会有摔倒,即使跌倒了,你也要懂得抓一把沙子在手里。—— 丁磊 码过的每一个需求、踩过的每一个坑、修过的每一个 bug 、学过的每一个知识以及看过的每一篇文章都不会成为无
前端劝退师
2020/12/15
2.1K0
如何优雅地解决多个 React、Vue  应用之间的状态共享
如何在微服务之间共享和同步代码
微服务架构非常适合构建可扩展的代码库,具有更少的耦合,更好的关注点分离,更高的弹性,结合不同的技术,最重要的是,更好的模块化和构建它的组件的可重用性。
February
2018/11/23
2.7K0
如何在WordPress网站之间共享用户和登录
wordpress为网站系统提供了相同的数据表结构,为快速实现多个WordPress网站之间共享用户数据提供了可能。wordpress如何实现如网易通行证等大站一样的共享用户登录呢?只需要将需要共享的数据库共用即可,我们这里只需要共享_user与_usermeta表,下面是完整实现过程。
许都博客
2021/06/15
1.9K0
Vue组件之间的数据共享
组件之间的数据共享 在项目开发中,组件之间的最常见的关系分为如下两种: 父子关系 兄弟关系 父子组件之间的数据共享 父子组件之间的数据共享又分为: 父 -> 子共享数据 子 -> 父共享数据 1. 父组件向子组件共享数据 父组件向子组件共享数据需要使用自定义属性。示例代码如下: 2. 子组件向父组件共享数据 子组件向父组件共享数据使用自定义事件。示例代码如下: 3. 兄弟组件之间的数据共享 在 vue2.x 中,兄弟组件之间数据共享的方案是 EventBus。 EventBus 的使用步骤 创建
777nx
2023/05/02
8010
Vue组件之间的数据共享
如何在多个应用程序中共享日志配置
有的时候你有多个应用程序,它们需要使用相同的日志配置。在这种情况下,你可以将日志配置放在一个共享的位置,然后通过项目文件快速引用。方便快捷,不用重复配置。
newbe36524
2023/08/23
2650
多个git账号之间的切换
做过很多遍了,却总是记不住,这回从头来描述一下。 介绍 所谓多个git账号,可能有两种情况: 我有多个github的账号,不同的账号对应不同的repo,需要push的时候自动区分账号 我有多个git的账号,有的是github的,有的是bitbucket的,有的是单位的gitlab的,不同账号对应不同的repo,需要push的时候自动区分账号 这两种情况的处理方法是一样的,分下面几步走: 处理 先假设我有两个账号,一个是github上的,一个是公司gitlab上面的。先为不同的账号生成不同的ssh-key
happy123.me
2018/06/04
2K0
面试官:sessionStorage可以在多个Tab之间共享数据吗?
英文 | https://fatfish.medium.com/interviewer-can-sessionstorage-share-data-between-multiple-tabs-c30983c61501
五月君
2023/09/06
4880
面试官:sessionStorage可以在多个Tab之间共享数据吗?
多个线程之间的通信问题
在同步代码块中,锁对象是谁,就用那个对象来调用wait和notify 为什么wait方法和notify方法需要定义在Object?       因为所有的对象都是Object的子类对象,而所欲的对象都可以当做锁对象
砖业洋__
2023/05/06
4320
多个线程之间的通信问题
共享主机和 WordPress 主机之间的区别
共享主机:顾名思义,共享主机基本上是一种网络托管,服务提供商提供来自多个网站的网页,并允许这些网站共享连接到互联网的物理服务器。它将网站内容存储在服务器上,并在需要时提供给访问者。
海拥
2022/12/11
5.9K0
在 request 之间共享 SecurityContext
既然 SecurityContext 是存放在 ThreadLocal 中的,而且在每次权限鉴定的时候都是从 ThreadLocal 中获取 SecurityContext 中对应的 Authentication 所拥有的权限,并且不同的 request 是不同的线程,为什么每次都可以从 ThreadLocal 中获取到当前用户对应的 SecurityContext 呢?
johnhuster的分享
2022/03/28
7080
时代智能利器:Zapier —— 简化工作,提高效率!
在当今数字时代,人们面临着越来越多的数字化需求,如何高效连接应用程序和优化工作流程成为一大挑战。Zapier 作为一款强大的在线自动化工具,为用户提供了简单而高效的解决方案。无需编写代码,Zapier可以帮助你轻松连接各种应用程序,并实现自动化工作流程。
程序那些事儿
2023/08/10
8.5K0
时代智能利器:Zapier —— 简化工作,提高效率!
每个前端开发者都应知道的14个实用网站
在本文中,我将分享一些非常有用的网站合集,这些网站可以在你的日常工作中极大地帮助你。这些网站已经成为我各种任务的首选资源,节省了我的时间,提高了工作效率
前端小智@大迁世界
2023/08/16
1.2K0
每个前端开发者都应知道的14个实用网站
每个前端开发者都应知道的10个实用网站
Documatic 是一个高效的搜索引擎工具,旨在帮助开发人员轻松搜索他们的代码库,找到特定的代码片段、函数、方法和其他相关信息。该工具旨在通过在几秒钟内快速提供准确和相关的搜索结果,节省开发人员宝贵的时间,提高他们的生产力。
前端小智@大迁世界
2023/08/16
4480
每个前端开发者都应知道的10个实用网站
【JavaSE专栏78】线程同步,控制多个线程之间的访问顺序和共享资源的安全性
本文讲解了 Java 中线程同步的语法和应用场景,并给出了样例代码。线程同步是一种机制,用于控制多个线程之间的访问顺序和共享资源的安全性。当多个线程并发地访问共享资源时,如果没有适当的同步机制,可能会导致数据不一致或出现竞态条件等问题。
Designer 小郑
2023/08/17
2830
【JavaSE专栏78】线程同步,控制多个线程之间的访问顺序和共享资源的安全性
SFTPServer如何共享多个目录
在使用知行之桥EDI系统的时候,有些客户作为SFTPServer端进行SFTP连接的时候,希望能够将文件按照不同的业务类型进行区分,并将区分好的文件放入不同的文件夹中,然后将这些文件夹共享给合作伙伴。
知行软件EDI
2023/02/03
1.1K0
基于CPU和RabbitMQ进行自动伸缩
最终用户客座文章作者:Ratnadeep Debnath,Zapier 网站可靠性工程师
CNCF
2022/03/27
1.3K0
基于CPU和RabbitMQ进行自动伸缩
【转载】如何在CentOS 7服务器之间使用NFS共享目录
NFS 即 (Network File System) 的缩写,最大的功能就是可以通过网络,让不同的机器、不同的操作系统实现共享彼此的文件。
兜兜转转
2023/03/08
2.3K0
如何在博客的日志之间显示广告
这篇文章将向你展示如何在 WordPress 主页上的日志之间放置 AdSense 代码(或者其他广告的代码)。同样的方法也可以用于在存档页面(包括分类和作者存档页面)放置广告。
Denis
2023/04/13
5740

相似问题

带番石榴EventBus的条件订阅

20

Eventbus事件订阅者

27

与番石榴eventBus订阅者一起使用Spring事务处理

12

芭乐eventbus有订阅者吗?

10

Vertx : eventBus订阅者被取消订阅的原因

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文