例如,如果我想存储哪些城市的人访问过,那么每个城市将有多个访问者,每个人将访问不止一次的城市,我该如何实施?
有时我想查询城市属性(例如所有访问过法国城市的人),有时我可能想查询人员属性(30岁以下的人访问过的所有城市)。
我自己想到了两种方式:
选项二对我来说似乎最好。但是,我认为对于两个查询示例中的每一个都需要至少三个ScriptDB查询。 'anyOf'也会变得非常大,我不确定这是不是一个问题。
示例:
var db = ScriptDb.getMyDb();
var cityResult = db.query({type: 'city', country: 'France'});
var citiesInFrance= getAllCityIds(cityResult);
var visitResult = db.query({type: 'visit', cityId: db.anyOf(citiesInFrance)});
var personsVisitedFrance = getAllPersonIds(visitResult);
var personResult = db.query({type: 'person', personId: db.anyOf(personsVisitedFrance)});
这看起来有些麻烦,特别是与oldskool sql查询相比时。这是要走的路,还是我应该完全研究其他事情?
答案 0 :(得分:2)
我认为这一切都取决于你想要优化的内容。您经常做什么:注册访问或查询访问者?
在“oldskool”sql上,规则是“规范化”数据,这意味着您应该单独存储访问并使查询复杂化。但是在no-sql上,人们通常选择第一种选择。使查询变得简单,变化更复杂一些。这就是我自己做的。这是速度和空间之间的权衡。
请注意,在ScriptDb上你无法query if an item is inside an array。所以你真的需要设置一个访问过的城市和/或国家的“地图”。 e.g。
person = {type:'person', personId:'foo', otherFields:'bar',
visitedCities:{Paris:true, Nantes:true}, visitedCountries:{France:true}};
如果你需要在城市中查询,那么城市也会有类似的东西。如果你只需要列表,那么数组可能更合适。