草庐IT

MongoDB规范化,外键和加入

coder 2023-04-23 原文

在我真正深入研究 MongoDB 几天之前,我想我会问一个非常基本的问题,即我是否应该深入研究它。我基本上没有使用nosql的经验。

我确实阅读了一些关于文档数据库的一些好处,我认为对于这个新应用程序来说,它们会非常棒。为许多类型的对象(许多 m 对 m 关系)和子类做收藏夹、评论等总是很麻烦 - 处理起来有点痛苦。

我还有一个结构,在 SQL 中定义会很痛苦,因为它非常嵌套,并且比 15 个不同的表更好地转换为文档。

但我对一些事情感到困惑。

  1. 是否仍需要保持数据库标准化?我真的不想更新多条记录。这仍然是人们在 MongoDB 中设计数据库的方式吗?

  2. 如果用户收藏了一本书,并且该选择仍存储在用户文档中,但随后该书被删除,会发生什么情况?如果没有外键,关系如何分离?我是否要亲自负责删除所有链接?

  3. 如果用户收藏了一本不再存在的书并且我查询它(某种连接),会发生什么情况?我必须在这里做任何容错吗?

最佳答案

MongoDB 不支持服务器端外键关系,也不鼓励规范化。如果可能,您应该将您的子对象嵌入到父对象中,这将提高性能并使外键完全没有必要。也就是说,这并不总是可能的,因此有一个称为 DBRef 的特殊构造,它允许引用不同集合中的对象。这可能不会那么快,因为 DB 必须进行额外的查询才能读取对象,但允许某种外键引用。

您仍然必须手动处理您的引用资料。只有在查找您的 DBRef 时,您才会看到它是否存在,如果引用的目标不再存在,DB 将不会遍历所有文档来查找引用并删除它们。但我认为在删除这本书后删除所有引用将需要每个集合一个查询,仅此而已,所以真的没那么难。

如果您的架构更复杂,那么您可能应该选择关系数据库而不是 nosql。

还有一本关于设计MongoDB数据库的书:Document Design for MongoDB

更新 上面的书已经没有了,但是由于 MongoDB 的流行,还有很多其他的。我不会把它们都链接起来,因为这些链接可能会改变,在亚马逊上简单搜索会显示多个页面,所以找到一些应该不是问题。

查看 'Manual references' and DBRefs 的 MongoDB 手册页|更多细节和例子

关于MongoDB规范化,外键和加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5841681/

有关MongoDB规范化,外键和加入的更多相关文章

  1. ruby - 如何离开加入Arel? - 2

    Arel3.0.2提供了两个类来指定连接类型:Arel::Nodes::InnerJoin和Arel::Nodes::OuterJoin并使用InnerJoin默认。foo=Arel::Table.new('foo')bar=Arel::Table.new('bar')foo.join(bar,Arel::Nodes::InnerJoin)#innerfoo.join(bar,Arel::Nodes::OuterJoin)#outerfoo.join(bar,???)#left如果要生成左连接,如何连接两个表? 最佳答案 你可以使用

  2. ruby - gem 规范失败 - 2

    我正在为毕业设计开发GEM,TravisCI构建不断失败。这是我在Travis上的链接:https://travis-ci.org/ricardobond/perpetuus/builds/8709218构建错误是:$bundleexecrakerakeaborted!Don'tknowhowtobuildtask'default'/home/travis/.rvm/gems/ruby-1.9.3-p448/bin/ruby_noexec_wrapper:14:in`eval'/home/travis/.rvm/gems/ruby-1.9.3-p448/bin/ruby_noexec_

  3. ruby-on-rails - 具有未知键和强参数的 Rails 哈希 - 2

    我有一个Rails应用程序,它在名为properties的字段中存储序列化哈希。虽然哈希键是未知的,所以我不知道有什么方法可以通过强参数实现这一点。谷歌搜索时,我发现了这个:https://github.com/rails/rails/issues/9454,但我想不出具体的解决方案。基本上,我的问题是:如何配置强参数以允许使用未知键的散列?感谢大家的帮助! 最佳答案 我最近遇到了同样的问题,我使用来自https://github.com/rails/rails/issues/9454的@fxn方法解决了它对于以properties

  4. ruby-on-rails - Scaffold Rails 3 View 中的外键下拉列表 - 2

    我使用脚手架和Rails3创建了2个模型。模型是位置和作业,每个作业都有一个位置。我在脚手架生成代码中创建了所需的引用调用,但是当我查看创建新作业的View时,我看到的只是一个文本框,我应该在其中添加location_id。我怎样才能让它变成下拉菜单以获得更好的用户体验? 最佳答案 想象一下,您有每个位置的titleAPI:http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/collection_select 关于r

  5. ruby - 如何禁止在 RSpec 中显示挂起(跳过)的规范? - 2

    我有几个跳过的规范。Pending:(Failureslistedhereareexpectedanddonotaffectyoursuite'sstatus)1)...#Notyetimplemented#./spec/requests/request_spec.rb:22如何抑制未决规范的输出? 最佳答案 您可以添加以下配置选项以从运行中过滤掉所有待处理的规范:RSpec.configuredo|config|config.filter_run_excludingskip:trueend此外,here是一个更详细的抑制输出的建议

  6. ruby-on-rails - 从帮助器规范中 stub 一个帮助器方法 - 2

    我正在构建Rails应用程序并使用RSpec制定测试。我为我正在创建的名为current_link_to的方法编写了测试。此方法应该检查当前页面是否对应于我传递给它的路径,并将current类添加到生成的链接中,以防它匹配。这是规范:require"spec_helper"describeApplicationHelperdodescribe"#current_link_to"dolet(:name){"Products"}let(:path){products_path}let(:rendered){current_link_to(name,path)}context"whenthe

  7. ruby-on-rails - 在 RSpec 中编写请求规范的正确方法是什么? - 2

    tl;dr:跳到最后一段最近一直在尝试使用RSpec的requestspecs做一些更有针对性的测试。我的测试主要是这样的:通用cucumber功能规范,即用户转到带有评论的帖子,对评论点赞,作者获得积分modelspecs当模型实际上具有某些功能时,即User#upvote(comment)controllerspecs我在其中stub了大部分内容,只是试图确保代码按照我期望的方式运行viewspecs当View中有一些复杂的东西时,例如仅在用户尚未投票时呈现upvote链接,这些被stub为好吧问题是当我有一些导致错误的特定场景时,一切似乎都在我无法重现它的模型/View层中工作。

  8. ruby-on-rails - 加速 RSpec 请求规范的方法 - 2

    我有33个规范以大约5秒的速度运行,以这种速度运行会导致测试套件变慢。我追踪到请求规范(4秒以上),因为模型规范只用了一小部分时间。我已经检查过,我的请求规范没有任何过于复杂或不必要的东西,所以我不知道该去哪里让它们更快,而不是只在推送代码之前运行它们以确保一切正常.加快请求规范的最佳方法是什么? 最佳答案 我使用Spork来加速我的测试。它保持整个环境加载以赢得时间。看看这个博客:http://ykyuen.wordpress.com/2010/12/14/rails-running-rspec-with-spork-test-s

  9. ruby-on-rails - Rspec 的 instance_double 创建间歇性规范失败 - 2

    我在使用instance_double时遇到间歇性测试失败。我有一个包含4个规范的文件。这是来源:require'rails_helper'describeSubmitPostdobefore(:each)do@post=instance_double('Post')allow(@post).toreceive(:submitted_at=)endcontext'onsuccess'dobefore(:each)doallow(@post).toreceive(:save).and_return(true)@result=SubmitPost.call(post:@post)endit

  10. ruby - 规范测试基于 EventMachine 的(Reactor)代码 - 2

    我正在尝试整个BDD方法并想测试AMQP基于Vanilla的方面Ruby我正在写的应用程序。选择Minitest后作为与其他名副其实的蔬菜框架不同的平衡功能和表现力的测试框架,我着手编写此规范:#File./test/specs/services/my_service_spec.rb#Requirementsfortestrunningandconfigurationrequire"minitest/autorun"require"./test/specs/spec_helper"#Externalrequires#MinitestSpecsforEventMachinerequire

随机推荐