我正在为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',
}
答案 0 :(得分:4)
您可能会听到有关此问题的不同意见,但请允许我与您分享我对此的看法。
首先,您的架构似乎对您的用例不正确。你很可能想要"播放"要成为一个数组而不是一个对象,所以:
{
"_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:不要双嵌套阵列;坚持"玩"在一个单独的集合
答案 1 :(得分:0)
通常你应该总是喜欢嵌入在MongoDB中的引用,所以你已经朝着正确的方向前进了。
对1:n关系使用引用的唯一原因是当您有增长的对象时,因为导致文档大小增加的更新可能会很慢。但是,您似乎正在使用不会经常增长的数据(可能每天几次),这可能意味着您不应该遇到性能问题。