2

たとえば、人が訪れた都市を保存したい場合、各都市には複数の訪問者がいて、各人は複数の都市を訪れます。どのように実装すればよいですか?

都市の属性 (たとえば、フランスのある都市を訪れたすべての人) についてクエリを実行したい場合もあれば、人物の属性 (30 歳未満の人が訪れたすべての都市) についてクエリを実行したい場合もあります。

私は自分で2つの方法を考えました:

  1. 各都市オブジェクトに訪問者の配列を含め、各人物オブジェクトに都市の配列を含めます。ただし、これは同じデータを 2 回格納することを意味し、オブジェクトが大きくなる可能性があります。
  2. 都市と人の両方の ID を格納する追加のオブジェクト「visit」を作成します。

オプション 2 が最適と思われます。ただし、2 つのクエリ例のそれぞれについて、少なくとも 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 クエリと比較すると、やや面倒に思えます。これが進むべき道ですか、それともまったく別のことを検討する必要がありますか?

4

1 に答える 1

2

それはすべて、最適化したいものに依存すると思います。より頻繁に行うこと: 訪問を登録するか、訪問者を照会しますか?

「oldskool」SQL では、ルールはデータを「正規化」することです。つまり、訪問を個別に保存し、クエリを複雑にする必要があります。しかし、no-sql では、通常、最初のオプションを使用します。クエリを簡単にし、変更をもう少し複雑にします。それは私が自分でやることです。それは速度とスペースの間のトレードオフです。

ScriptDb では、項目が array 内にあるかどうかを照会することはできません。したがって、訪問した都市や国の「地図」を設定する必要があります。例えば

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

また、都市でクエリを実行する必要がある場合は、都市についても同様です。リストだけが必要な場合は、おそらく配列よりも適切です。

于 2013-05-30T02:13:21.300 に答える