MongoDB NoSQL架构设计

时间:2014-03-12 16:57:02

标签: mongodb mongodb-query

我有一个数据库设计问题,我真的需要一些帮助和建议。

我们已经建立了一个拍卖平台。最初的策略是"用户可以竞标单一拍卖"并且MongoDB被选中用于工作并且到目前为止一直很好。

现在,我正在尝试实施不同的架构来支持拍卖组,以便用户可以创建一组拍卖,并且客户可以出价拍卖或团体。

第1组

  • 拍卖A
  • 拍卖B
  • 拍卖C

第3组

  • 拍卖D

我正在努力采取正确的方法。理想情况下,在搜索拍卖时,API返回会将组内的所有拍卖分组。至少这是实施集团战略的主要要求,否则对客户来说无用。

这就是我的想法:

保留一个集合竞价。当用户发布组时,每次拍卖存储文档,以及标记为 groupId 的组本身(相同集合)的额外文档(当为null时,我知道它是组本身)。在本文档中,我将保存拍卖的属性(如最低预算金额,总出价金额等)。

但是我如何对此进行分组并返回一个包含拍卖列表的组?您是否认为这是一个合适的解决方案或更好的解决方案,作为MongoDB的文档数据库是一个很好的选择与群组的实现?

这种拍卖方式适用于服务。当前架构是:

拍卖

  • 编号
  • CategoriesId,End and Status - 复合键
  • 开始
  • MaxBid
  • MinBid
  • 出价 - UserId,Ammount和日期
  • 声誉 - 基于已完成的工作,收入和反馈,发布出价所需的最低声誉

分类

  • 命名
  • 描述
  • 统计

用户

  • 出价 - 用户的工作提案:拍卖ID,Ammount,日期
  • 拍卖 - 拍卖已创建
  • 声誉
  • TotalEarning
  • 类别 - 类别用户已完成工作的ID。

目前,API正按类别,结束和名称过滤拍卖。组实现仅按类别进行过滤。

此应用程序中还有其他功能,但它们与拍卖组无关。

2 个答案:

答案 0 :(得分:0)

您必须复制部分数据才能获得最佳搜索效果。如果您来自关系数据库阵营,这可能是最难学的内容之一。

您的AuctionGroups集合需要有足够的有关每次拍卖的数据,以便进行有用的搜索 - 而不仅仅是每次拍卖的ID。

AuctionGroups {
 _id : ObjectId,
 name : String, // needed? do the groups have a searchable name/desc?
 auctions: { 
   auctionId : ObjectId,
   auctionDesc : String,
   categoryName : String
 }
}

您应该为要作为拍卖组的一部分搜索的字段添加索引(可能是全文)。您应该在AuctionGroup记录中包含正确显示搜索结果所需的所有字段。当用户打开特定拍卖时,然后从数据库中加载完整的拍卖记录。可能略有更新的值。 (您将注意到,如果您经常使用ebay,那么当前的出价和搜索结果的其他详细信息通常会比实际列表延迟几秒钟。同样的交易。)您可以反馈到您的AuctionGroups更新主要的拍卖条目或计时器。

答案 1 :(得分:0)

我更像是一个关系型的DB家伙,但是我会有2个收藏:

1)分组

  • 的GroupID
  • AuctionGroupID:指向Auctions集合中相关“分组”拍卖的ID
  • AuctionIds:相关“正常”拍卖的ID列表 拍卖集合
  • 额外的搜索数据(就像一个 所有分组拍卖的缓存):
    • [CategoriesID]:相关拍卖中的类别汇总列表
    • minBegin,maxBegin
    • minEnd,maxEnd

2)具有附加属性的拍卖:

  • GroupID - 对于非分组拍卖为空
  • IsGroup(可选,见下文)布尔标志 - 否则您必须匹配AuctionID Group集合中的AuctionGroupID用于确定此拍卖是否为“分组”

所以想法是当用户进入一个群组时:

  1. 为该组
  2. 生成新的guid GroupID
  3. 插入新的 Auctions集合中的“记录”,其中GroupID =步骤中的id 1,并且可选地IsGroup = true
  4. 在中插入新的“记录” 组集合,在步骤1)中具有GroupID,而AuctionGroupID在步骤2中具有结果ID
  5. 当用户将拍卖(带有AuctionID)添加到组(具有GroupID)时:

    1. 使用该GroupID在Auction记录中设置GroupID属性,         并且可选地是isGroup = false
    2. 将auctionID添加到“组记录”中的auctionId列表
    3. 更新有关的公开信息 组记录(类别,minBegin,maxBegin
    4. 注意:

      1. 当用户更改任何内容时,您将需要执行步骤3)
      2. 中的现有拍卖
      3. 群组中的所有拍卖加上分组拍卖本身将在拍卖集合中具有相同的GroupID
        • 如果您使用optionall isGroup标志,这将告诉您哪些活动是“组”
        • 否则,您可以通过将其与组记录中的AuctionGroupID进行匹配来判断哪一个是分组的。
      4. 这样您就可以有效地检索所有组和任何组的auctionIds。然后,您将不得不使用这些ID查询拍卖集合。所以,是的,您将对数据库进行N + 1次呼叫(1次为该组加1次每次拍卖,但我认为每组的拍卖数量无论如何都会很小,所以这不应该是一个大问题。)

        如果您想知道拍卖是否已分组,那么只需检查其GroupID是否为空,如果它通过其ID获取相关的组

        假设一次拍卖可以绑定到0或1组。如果您希望1次拍卖可以绑定到多个组,那么只需将Auctions集合中的GroupID更改为数组