【问题标题】:Design collection, how to de normalize设计集合,如何去规范化
【发布时间】:2015-04-19 07:14:41
【问题描述】:

我在许多地方以不同的价格提供服务。在过渡 SQL 中,当我想在某些区域中查找显示最高和最低价格的服务(区域将选择多个位置)时,我会让包含 service_id 和 location_id 的 price_location 表进行连接和分组。

由于服务和位置非常多,我正在考虑以下几点:

service_location_price = [
  {
    serviceName:'s1';
    ,price:10
    ,location:'location1'
  },{//to keep it simple only serviceName is here but
     // there will be multiple providers for the same
     // serviceName at same location but different price
    serviceName:'s1';
    ,price:12
    ,location:'location1'
  },{
    serviceName:'s1';
    ,price:15
    ,location:'location2'
  }
];

基本上是打破第二范式的平面文件数据(具有重复行)。

现在聚合和/或映射减少应该可以很好地使某个区域的服务显示最低和最高价格。或显示可用于某些服务的位置。

service 和 location 都有自己的集合,service_location_price 集合为此查询复制一些 service 和 location 值。

有些人担心重复数据,并希望以不同的方式实现(猫鼬填充匹配??)。

不确定我的选择是什么,因此希望有可能更有经验的人提供一些意见。有没有更好的方法让搜索到

服务和位置不会有太多更新,但两者之间的关系可能会发生变化、添加或删除。但是区域内的服务搜索会非常频繁地执行。

【问题讨论】:

  • 我认为您提出的服务位置价格模型是一个很好的模型。你能解释一下为什么你的查询需要聚合或 map-reduce 吗?据我了解模型和您的查询,您只需要常规的finds。
  • @wdberkeley 谢谢你的回复;回答你的问题:某个区域的服务总数,某个服务的最低最高价格(在某个区域)和某个服务的供应商总数(在某个区域)。客户宁愿没有重复的数据,并且确信 mongoose 可以像使用填充的关系数据库一样表现。我认为即使有可能它会在获取和填充后在内存中完成,所以不会很好地扩展
  • 因篇幅问题已回复。

标签: javascript mongodb denormalization


【解决方案1】:

填充是一个大的$in 查询来解析引用,然后它将数组中的引用替换为相应的文档。如果引用字段被索引,这还不错,但它是一个额外的查询,它是糟糕架构设计的一个拐杖,因为当您不使用关系数据库时,它可以更容易地模拟关系数据库,并且应该以不同的方式解决问题.我认为它应该从 Mongoose 中删除,但遗憾的是有点晚了:(

我不确定您是如何为区域建模的 - 您说一个区域可以是多个位置,所以我将一个区域建模为 location 值的数组。

给定区域的服务总数:

db.service_location_price.distinct("serviceName", { "location" : { "$in" : region_array } })

这将为您提供服务名称数组,因此.length 将提供服务数量。

某地区服务的最低/最高价格:

db.service_location_price.find({ "location" : { "$in" : region_array }, "serviceName" : "service1" }).sort({ "price" : 1 }).limit(1)
db.service_location_price.find({ "location" : { "$in" : region_array }, "serviceName" : "service1" }).sort({ "price" : -1 }).limit(1)

示例文档中没有关于服务供应商的信息,所以我不知道如何查找某个地区的服务供应商数量。也许您想在文档中包含 supplier 字段?

【讨论】:

    猜你喜欢
    • 2015-01-15
    • 2017-12-28
    • 2012-02-25
    • 2013-01-18
    • 2018-10-19
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    相关资源
    最近更新 更多