在我的项目中,我们有一个典型的客户订阅场景,我们必须在mongo中存储细节。我们已针对此方案确定了以下数据模型:
即。客户可以拥有多个订阅,每个订阅可以有多个激活码。
{
"CustomerCompany" : "abc",
"CustomerEmail" : "abc@abc.com",
"CustomerID" : "124598",
"CustomerName" : "abc xyz",
"CustomerType" : "Indivisual",
"IsOurCustomer" : true,
"Subscriptions" : [{
"ContentDeliveryFormat" : "XML",
"ContentDeliverySchedule" : "Daily",
"ContentProviderName" : "asdf",
"ContentType" : "CFR",
"ContentCategory" : "CFR",
"SubscriptionExpiryDate" : "11/19/2014 15:22:39:800 IST",
"SubscriptionID" : "111",
"ActivationCount" : 1,
"Activations" : [{
"ActivationCode" : "35f110b8-1b59-44c5-9874-adcc9d008898",
"ActivationCodeGenDate" : "05/23/2014 15:22:59:997 IST",
"ActivationExpiryDate" : "05/28/2014 15:22:59:997 IST",
"ActivationDate" : null,
"ActivationStatus" : "Unused"
}],
"SubscriptionStatus" : "Subscribed"
}],
"_id" : ObjectId("537f1a7ce96e0b34e98b8de7")
}
由于我是mongodb的新手并且对此进行详细搜索无法说服我在这里发布我的查询。
我有以下两个问题:
建模是否正确在mongodb中遵循的最佳做法?
如果我遵循这种方法,那么使用当前的数据模型很简单 搜索带有输入的文档作为激活码,结果最差 案例效率为O(n3)。我认为如果系统扩大,这个 方法将是一个很大的NO-NO。
专家们能否对这种情况发表评论?
先谢谢
答案 0 :(得分:0)
您需要考虑以下因素。文档一个接一个地写入磁盘。当您稍后向阵列中添加更多内容时,文档会增长 - 并且可能需要移动以适应数据添加。此外,很可能您的数组值将被编入索引 - 这意味着所有这些索引都需要在文档移动时进行更新。最后,对于您的应用程序,当您加载客户数据时,您是否真的需要加载所有订阅和激活密钥?如果答案为否,那么您应该考虑我描述的整体情况,并可能将其保存在单独的集合中。文档越大,它们就越少适合RAM。最重要的是,一旦最初创建文档,您期望在文档中实现多少动态增长?