如何在ScriptDB中实现多对多关系

时间:2013-05-29 22:37:15

标签: google-apps-script

例如,如果我想存储哪些城市的人访问过,那么每个城市将有多个访问者,每个人将访问不止一次的城市,我该如何实施?

有时我想查询城市属性(例如所有访问过法国城市的人),有时我可能想查询人员属性(30岁以下的人访问过的所有城市)。

我自己想到了两种方式:

  1. 在每个城市对象中包含一组访问者,并在每个人物对象中包含一系列城市。但是,这意味着存储两次相同的数据,这可能会使对象变大。
  2. 创建一个额外的对象'访问',存储城市和人的ID。
  3. 选项二对我来说似乎最好。但是,我认为对于两个查询示例中的每一个都需要至少三个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查询相比时。这是要走的路,还是我应该完全研究其他事情?

1 个答案:

答案 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}};

如果你需要在城市中查询,那么城市也会有类似的东西。如果你只需要列表,那么数组可能更合适。