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

Mat*_*vić 3 mongoose mongodb bson mean-stack

我正在为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',
    }
Run Code Online (Sandbox Code Playgroud)

Rem*_*iet 5

您可能会对此发表不同意见,但让我与您分享我的观点。

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

{  
   "_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
            }
         ]
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

您会发现,没有多少情况可以满足以上所有条件。这些标准中有些是主观的,但是轻量级引用实际上并没有那么复杂。实际上,唯一的麻烦就是无法“以原子方式”修改不同集合中的文档,这并不像大多数情况下那样严重。

TL; DR:不要将嵌套数组加倍;坚持“戏剧”在一个单独的收藏