2

例如,如果我想存储人们访问过哪些城市,那么每个城市都会有多个访问者,并且每个人都会访问不止一次的城市,我应该如何实现呢?

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

我自己想到了两种方法:

  1. 在每个城市对象中包含一组游客,在每个人对象中包含一组城市。但是,这意味着将相同的数据存储两次,并且可能会使对象变大。
  2. 创建一个额外的对象“访问”,存储城市和人的 ID。

选项二对我来说似乎是最好的。但是,我认为这两个查询示例中的每一个都需要至少三个 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 查询相比。这是要走的路,还是我应该完全研究其他东西?

4

1 回答 1

2

我认为这完全取决于您要优化的内容。您更常做的事情是:注册访问或查询访问者?

在“oldskool” sql 上,规则是“规范化”数据,这意味着您应该真正单独存储访问并使查询复杂化。但是在 no-sql 上,人们通常选择第一个选项。使查询变得简单,更改更复杂一些。这是我自己会做的。这是速度和空间之间的权衡。

请注意,在 ScriptDb 上,您无法查询项目是否在数组中。因此,您确实需要设置访问过的城市和/或国家/地区的“地图”。例如

person = {type:'person', personId:'foo', otherFields:'bar',
   visitedCities:{Paris:true, Nantes:true}, visitedCountries:{France:true}};

如果您需要在城市中查询,则类似的城市。如果您只需要列表,那么数组可能更合适。

于 2013-05-30T02:13:21.300 回答