MongoDB NOSQL模式设计



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

这是针对我们构建的拍卖平台。最初的策略是"用户可以竞标单个拍卖",而MongoDB被选为这项工作,到目前为止还不错。

现在,我正在尝试实施另一个模式以支持拍卖组,以便用户可以创建几个拍卖和服装的组,可以进行拍卖或组。

第1组

  • 拍卖a
  • 拍卖b
  • 拍卖C

第3组

  • 拍卖d

我正在为正确的方法而苦苦挣扎。理想情况下,在搜索拍卖时,API返回将对组内的所有拍卖进行分组。至少这是实施小组策略的主要要求,否则对于服装师来说是没有用的。

这就是我的想法:

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

但是,我该如何对此进行分组并返回一个带有拍卖列表的小组?您认为这是一个合适的解决方案,还是更好的解决方案,成为文档DB是与小组实现的好选择?

此拍卖模式是用于服务的。当前的模式为:

auctions

  • ID
  • categoriesId,结束和状态 - 复合键
  • 开始
  • MAXBID
  • minbid
  • bids - 用户ID,Ammount和Date
  • 声誉 - 根据完成,赚取和反馈的最低声誉需要发布出价的最低声誉

类别

  • 名称
  • 描述
  • Stats

用户

  • 出价 - 用户的工作建议:拍卖ID,Ammount,Date
  • auctions - 创建的拍卖
  • 声誉
  • TotalArning
  • 类别 - 用户完成作业的类别ID。

当前,API按类别,端和名称进行过滤拍卖。组实现只能由类别过滤。

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

您必须复制一些您的某些用于最佳搜索的数据。如果您来自关系DB营地,这也许是最难学习的一件事。

您的AuctionGroups Collection将需要拥有有关每次拍卖的足够数据以允许进行有用的搜索 - 而不仅仅是每次拍卖的ID。

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

您应该为您想要作为拍卖组的一部分搜索的任何字段添加索引(可能是全文)。您应该在拍卖集记录中包括正确显示搜索结果所需的所有字段。当用户打开特定的拍卖时,然后加载DB中的全部拍卖记录。可能具有略有更新的值。(您会注意到,如果您定期使用eBay,与实际列表相比,当前的出价价格和搜索结果的其他详细信息通常会延迟几秒钟。同一交易。)您可以在更新更新时将其返回拍卖组主要拍卖条目或计时器。

我更像是一个关系DB家伙,但是我将有2个集合:

1)与

组组
  • groupid
  • AuctionGroupID:指向拍卖集中相关"分组"拍卖的ID
  • 拍卖:ID列表中相关的"正常"拍卖拍卖集
  • 额外的搜索数据(将像用于所有分组拍卖的缓存):
    • [类别ID]:相关拍卖中类别的汇总列表
    • MinBegin,MaxBegin
    • 新闻,最大
    • etc

2)具有其他特性的拍卖:

  • groupId-非群体拍卖为null
  • iSgroup(可选,请参见下文)布尔标志 - 否则,您必须将拍卖ID与小组集合中的拍卖集群以确定此拍卖是否为"分组"

,当用户进入组时,这个想法将是:

  1. 为小组生成新的GUID GroupID
  2. 插入新的拍卖集中的"记录",带有groupId = spep中的ID1,以及可选的isGroup = true
  3. 在组收集,在步骤1)和ApletGROUPID中的groupID和第2步中的结果ID

用户将拍卖(带有拍卖的)添加到组(与groupID)时:

  1. 使用该GroupID在拍卖记录中设置GroupID属性, 和可选的isGroup = false
  2. 在小组记录中的拍卖列表中添加拍卖
  3. 更新一致的信息小组记录(类别,Minbegin,MaxBegin

注意:

  1. 您需要执行步骤3)当用户更改任何一个小组中的现有拍卖
  2. 组中的所有拍卖加上分组拍卖本身将在拍卖集合中具有相同的群体形式
    • 如果您使用Optionall ISGroup标志,这将告诉您哪些活动是"组"
    • 否则,您可以通过将其与组记录中的拍卖集群匹配来判断其中一个是分组的。

这样,您可以有效地检索任何组的所有组和拍卖行。然后,您将不得不使用这些ID查询拍卖集。因此,是的,您将拨打数据库的n 1个电话(组为1个,每次拍卖1个,但是我想每个组的拍卖次数无论如何都会很小,所以这没什么大不了的)。

如果您想知道是否分组拍卖,则只需检查其groupID是否为null,是否通过其ID

获得相关组

假设一个拍卖可以绑定到0或1组。如果您希望1个拍卖可以与1组超过1组限制,则只需将拍卖集中的GroupID更改为阵列

最新更新