我很好奇如何构建一个具有多对多关系且可能有数万条记录的 MongoDB。
假设您有一个餐厅数据库,用于跟踪大量餐厅以及所有在这些餐厅签到的人。因此,用户可能想要查找一个人并查看他们签到的所有餐厅,但也想查找一家餐厅并查看所有签到的人。
如何以一种有意义且易于搜索和更新的方式构建它?
最佳答案
您给出的示例与大多数现实世界中多对多关系的示例一样,实际上是少对少 关系的示例。您可能有许多餐厅和许多食客,但与整个集合相比,任何给定的餐厅都只为一小部分食客提供服务,而且大多数个人食客只会光顾一小部分餐厅。这听起来像是一个稀疏链接的网络,其中链接密度比明显低于 1。
To measure the link density (edge density) of a network, we calculate the ratio of existing links m to the total number of possible links. For a network of N nodes, the network link density is D = m / 0.5*N*(N-1) The (maximal) link density D of a completely connected network is 1. - Network-Science
但是,您问的是多对多,那么我们以神经网络为例如何?神经网络通常形成密集网络,因此代表真正的多对多网络。在这种情况下,答案很简单——不要使用 mongoDB。使用根据您的特定要求量身定制的自定义结构和序列化策略。毕竟,真正的多对多关系几乎总是离群值,因此需要进行特殊处理。
话虽如此,在不牺牲丰富的文档结构的情况下,可以在 mongoDB 中对更常见的少对少关系进行建模,而如何实现这一点取决于您的访问模式。
因此,对于餐厅/晚餐网络示例,如果您通常要查询餐厅的用餐者,那么您将创建一个包含每家餐厅的 diner_id 数组。另一种方式意味着每个用餐者都有一组 restaurant_ids。两者都是为了双向查询能力。
必须小心,因为 mongoDB 中没有 foreign_key 约束,因此维护数据的参照完整性是您的责任。
如果性能对您来说最重要,那么您可能希望将数据嵌入到每个文档中,而不是使用 id 来引用它。这是读取的更高性能选项(与其说是写入),因为所有数据都可以一次从磁盘中提取出来。这意味着您在更新数据值时需要做更多的工作以确保数据的完整性,但这通常并不像乍看起来那么可怕。食客真正改名的频率是多少?根据文档大小,您可能不一定要嵌入完整文档,数据的子集加上指向完整记录的 id 通常可以解决问题。
简而言之,mongoDB 模式设计应由应用程序需求驱动。不同应用程序的不同模式,而不是一个单一的关系数据库来统治它们。数据的真相是什么?应用程序实际上如何使用这些数据?存储的文档对象有多大?回答这些问题,您的模式实际上将自行设计。
关于MongoDB - 多对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28267338/
我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
我想合并多个事件记录关系例如,apple_companies=Company.where("namelike?","%apple%")banana_companies=Company.where("namelike?","%banana%")我想结合这两个关系。不是合并,合并是apple_companies.merge(banana_companies)=>Company.where("namelike?andnamelike?","%apple%","%banana%")我要Company.where("名字像?还是名字像?","%apple%","%banana%")之后,我会写代
我有一个简单的问题,与关联有关。我有一个书的模型,它有_onereservation。预订属于_书本。我想在预订Controller的创建方法中确保在预订时没有预订一本书。换句话说,我需要检查该书是否存在任何其他预订。我该怎么做?编辑:Aaa我做到了,感谢大家的提示,学到了一些新东西。当我尝试提供的解决方案时,出现no_method错误或nil_class等。这让我开始思考,我尝试处理的对象根本不存在。Krule给了我使用book.find的想法,所以我尝试使用它。最终我得到了它的工作:book=Book.find_by_id(reservation_params[:book_id])
我有一组名为Tasks和Posts的资源,它们之间存在has_and_belongs_to_many(HABTM)关系。还有一个连接它们的值的连接表。create_table'posts_tasks',:id=>falsedo|t|t.column:post_id,:integert.column:task_id,:integerend所以我的问题是如何检查特定任务的ID是否存在于从@post.tasks创建的数组中?irb(main):011:0>@post=Post.find(1)=>#@post.tasks=>[#,#]所以我的问题是,@post.tasks中是否存在"@task
根据我目前的理解,如果我必须描述Rails应用程序的各个组件如何协同工作以响应请求,我会说以下内容:1)路由确定哪些请求URL映射到哪些Controller方法。2)Controller方法从模型中获取信息并将该信息(以全局变量的形式)传递给相应的View模板。3)View模板使用存储在全局变量中的数据来构造最终响应。在上面的解释中,几个组件之间的关系是明确的,不可否认的;即:1)路由和Controller方法2)Controller方法和View模板其实上面的关系是一对一的。但是,模型类与其相邻组件类型(即Controller)的关系并不明确。是的,Controller从模型中检索信
我在目录“/home/enterprise/pkg”中有一个本地gem(enterprise-0.0.1.gem)。它依赖于active_directorygem(v1.5.5),这是在它的enterprise.gemspec文件中指定的,如下所示:-gem.add_dependency("active_directory")在我的应用程序的Gemfile中,我添加了以下行:-gem'enterprise','0.0.1',path=>'/home/enterprise/pkg'当我做的时候bundleinstall在我的应用程序的源目录中,只安装了企业gem。因此,我遇到了引用act
我有以下模型用户has_many:users_contactshas_many:contacts,through::users_contactsaccepts_nested_attributes_for:contacts,allow_destroy:true联系方式has_many:users_contactshas_many:users,through::users_contactsaccepts_nested_attributes_for:users_contacts,allow_destroy:true用户联系belongs_to:usersbelongs_to:contacts
我正在构建这个图书馆应用程序,它有3个类。国家、图书馆和书籍。国家有许多图书馆,图书馆属于一个国家。图书馆有很多书,书是嵌入图书馆的。但是,当我执行此auto_pick_job时,我们到达top_free_book并调用library.state。由于某种原因,library.state为nil。我希望恢复状态但没有骰子。我调用和创建库的方式如下。所以图书馆将永远属于一个现有的国家。state=Stats.find(x)library=state.libaries.new(info)library.save_optimistic!我也很感激使用Struct的关系帮助。classStat
我有一个看起来像这样的类:classFoo在测试#nasty_bars_present?我想编写一个rspec测试来对bars关联进行stub,但允许where自然执行。像这样的东西:describe"#nasty_bars_present?"docontext"withnastybars"dobefore{foo.stub(:bars).and_return([mock(Bar,bar_type:"Nasty")])}it"shouldreturntrue"doexpect(foo.nasty_bars_present?).tobe_trueendendend上面的测试给出了一个关于