Couchbase Server固有のJOIN句〜実例による解説


はじめに

ここでは、Couchbase ServerのN1QLで利用することのできる、二つの特殊なJOINのタイプについて解説します(CouchbaseのJOINには3つの種類が存在し、もう一つはANSI JOINです)。

この二つのJOINは、それぞれ混同しやすいCouchbase独自のキーワードを持ちます。すなわち、ON KEYSON KEYです。

公式ドキュメント(後掲)にあたることにより、構文の理解(句中の右辺、左辺の意味)を得ることができますが、ここでは、直感的な理解を助ける事を意図し、実例による解説を行います。

Lookup JOIN

ON KEYS句を用います。

利用例

SELECT DISTINCT airline.name, airline.callsign, route.destinationairport, route.stops, route.airline
FROM `travel-sample` route
  JOIN `travel-sample` airline
  ON KEYS route.airlineid
WHERE route.type = "route"
AND airline.type = "airline"
AND route.sourceairport = "SFO"
AND route.stops = 0
LIMIT 4;

データモデル

  • 「ルート」と「エアライン」という、二つの種類のデータモデルがある
  • 「ルート」モデルのデータ構造は、「エアライン」(への参照)を含む

クエリの目的

  • 特定の条件(SFO発の直行便)を満たす「ルート」の情報とともに、その「ルート」が持つ「エアライン」の情報を取得する

Index JOIN

ON KEY句を用います。

利用例

SELECT * FROM `travel-sample` airline
  JOIN `travel-sample` route
  ON KEY route.airlineid FOR airline
WHERE route.type="route"
AND airline.type="airline"
AND airline.icao = "MLA";

データモデル

データモデル

  • 「ルート」と「エアライン」という、二つの種類のデータモデルがある
  • 「ルート」モデルのデータ構造は、「エアライン」(への参照)を含む

クエリの目的

  • 特定の条件(ICAOコード「MLA」)を満たす「エアライン」から、「ルート」で用いられているものを抽出し、その情報を取得する

注意

上記のクエリを実行するためには、下記のインデックスが必ず必要になります( travel-sampleバケットのプライマリーインデックスで代替することはできません)。

CREATE INDEX airline_icao ON `travel-sample`(icao) WHERE type="airline";

最後に

なぜ、それぞれのキーワードに、単数形・複数形が用いられているかを考えてみるのも、興味深い試みかと思います。

最後に、蛇足となりそうですが、公式ドキュメントのAdaptive Indexの章では、ここで扱ったINDEX JOINでは、Array Index(Adaptive Indexを含む)を利用できない、とされています。現実のプロジェクトでの応用の経験がないため、確定的なことは言えませんが、おそらくあまり意識しなければならない場面はないのではないかとも思われます。

参考情報

公式ドキュメント

JOIN Clause