mongodb中具有3层文档层次结构的数据模型

时间:2014-05-29 07:35:02

标签: performance mongodb data-modeling

在我的项目中,我们有一个典型的客户订阅场景,我们必须在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。

专家们能否对这种情况发表评论?

先谢谢

1 个答案:

答案 0 :(得分:0)

您需要考虑以下因素。文档一个接一个地写入磁盘。当您稍后向阵列中添加更多内容时,文档会增长 - 并且可能需要移动以适应数据添加。此外,很可能您的数组值将被编入索引 - 这意味着所有这些索引都需要在文档移动时进行更新。最后,对于您的应用程序,当您加载客户数据时,您是否真的需要加载所有订阅和激活密钥?如果答案为否,那么您应该考虑我描述的整体情况,并可能将其保存在单独的集合中。文档越大,它们就越少适合RAM。最重要的是,一旦最初创建文档,您期望在文档中实现多少动态增长?