[英]Meteor / Mongo - How do you Reference a Lookup Collection? (de-normalize vs normalize)
[英]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.