草庐IT

用于保留、嵌套或引用的 MongoDB 模式?

coder 2023-10-29 原文

我正在为 MongoDB 设计我的第一个数据库,我想知道我是否在朝着正确的方向前进。

它基本上是一个模拟剧院预订系统。嵌套 2 层或 3 层有什么本质上的错误吗?

它会在以后的查询中产生问题吗?

什么是性能和可用性方面的最佳解决方案?

我是否应该像对待预订的客户那样使用推荐信?

这是我目前所拥有的:

//shows

    {
       _id: 2132131,
       name: 'something',
       screenplay: ['author1', 'author2'],
       show_type: 'children',
       plays:  {
                  datetime: "O0:00:00 0000-00-00",
                  price: 120,
                  seats: 
                          {
                            _id:['a', 1],
                            status: 'reserved',
                            client: 1
                          },

                          {
                            _id:['a', 2],
                            status: 'reserved',
                            'client:1
                          }
                }
    }



//clients

    {
      _id:1,
      name: 'Julius Cesar',
      email: 'julius@rome.com',
    }

最佳答案

您可能会听到对此有不同的意见,但让我与您分享我对此的看法。

首先,您的模式似乎不适合您的用例。您很可能希望“播放”是一个数组而不是一个对象,所以:

{  
   "_id":2132131,
   "name":"something",
   "screenplay":[  
      "author1",
      "author2"
   ],
   "show_type":"children",
   "plays":[  
      {  
         "datetime":"O0:00:00 0000-00-00",
         "price":120,
         "seats":[  
            {  
               "_id":[  
                  "a",
                  1
               ],
               "status":"reserved",
               "client":1
            },
            {  
               "_id":[  
                  "a",
                  2
               ],
               "status":"reserved",
               "client":1
            }
         ]
      }
   ]
}

如果我的假设是正确的,那么您现在拥有双重嵌套数组,这是一种极其不切实际的架构,因为您不能在查询或更新中使用多个位置运算符。

尽管大多数 NoSQL 人群似乎认为实际上只有少数有效的用例可以将集合嵌入到文档中。需要满足以下条件:

  • 嵌入式集合在大小方面有非常明确的上限。在变得笨拙/低效之前,此限制不应高于几十个。
  • 嵌入式集合不应定期增长(这会导致文档在磁盘上移动,从而显着降低性能)
  • 嵌入集合中的元素不应包含数组属性(当前查询语言不允许您修改双重嵌套数组的特定元素)
  • 在不查询包含该嵌入集合的根文档的情况下,您不应该要求嵌套集合的元素。

您会发现满足上述所有条件的情况并不多。其中一些标准有些主观,但轻量级引用实际上并没有那么复杂。实际上,无法“自动”修改不同集合中的文档是唯一的麻烦,您会发现,在大多数情况下,这并不是一个听起来那么大的问题。

TL;DR :不要双重嵌套数组;将“plays”放在一个单独的集合中

关于用于保留、嵌套或引用的 MongoDB 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25158426/

有关用于保留、嵌套或引用的 MongoDB 模式?的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  3. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  6. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  7. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  8. Ruby——嵌套类和子类是一回事吗? - 2

    下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby​​解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc

  9. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  10. ruby-on-rails - 使用回形针的嵌套形式 - 2

    我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?

随机推荐