繁体   English   中英

设计收藏,如何去规范化

[英]Design collection, how to de normalize

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

由于服务和位置非常多,因此我在考虑以下方面:

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'
  }
];

基本上,平面文件数据打破了第二种正常形式(具有重复行)。

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

服务和位置都有自己的集合,并且service_location_price集合会为此查询复制一些服务和位置值。

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

不确定我在这里有什么选择,因此不胜感激有经验的人的一些意见。 是否有更好的方法来进行搜索

服务和位置不会更新太多,但是它们之间的关系可能会更改,添加或删除。 但是在区域中搜索服务将非常频繁地执行。

填充是一个大的$in查询,用于解析引用,然后将数组中的引用换出为相应的文档。 如果引用字段已建立索引,还不错,但这是一个额外的查询,并且是糟糕的架构设计的拐杖,因为当您不使用关系数据库时,它更容易模拟关系数据库,并且应该以不同的方式来解决问题。 我认为应该将其从猫鼬中删除,但是为此而已为时已晚:(

我不确定您如何建模区域-您说一个区域可以是多个位置,所以我会将一个区域建模为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字段?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM