原文

Introduction

ある table もしくは view(訳注:これを table/view と表記することとする)ともう一つの table/view を関連づけるには(creating a relationship)どうしたらいいのでしょうか。そのためには、片方の table/view のあるカラムと、もう一方の table/view のカラムが紐づいていることを「定義」すればいいのです。

A relationship from one table/view to another can be created by defining a link between a column of the table/view to a column of the other table/view.

一般的には relationshiop は foreign-key constraint を用いて定義することができます。しかし foreign-key constraint を使って relation を作れない場合もいくつかあります。例えば view が関わってくるような relatioship を作る場合です。なぜならば foreign-key を view に対して作成することはできないからです。

Typically, relationships are defined using foreign-key constraints. But in some cases, it might not be possible to use foreign-key constraints to create the relation. For example, while trying to create a relationship involving a view as foreign-keys can’t be created on views.

Using foreign keys

既に二つのテーブルを作成しましたね。author(id, name) と article(id, title, content, rating, author_id) の二つです。

Say we created two tables, author(id, name) and article(id, title, content, rating, author_id).

ではこれらのテーブルを foreign key を用いてつなげることで、nested query ができるようにしましょう。(訳注:nested query というのはこの先の例にあるように、article の情報の中にさらに author の情報がオブジェクト的に保持されており、さらに詳細を取得できるような query 構造のことです。article と author という本来別々のテーブルにある情報を結び付けることでこの構造が発生します。)

Let us now connect these tables to enable nested queries using a foreign-key:

Step 1: Add foreign-key constraint

では console から article table の Modify タブに移動し、下の方にある Foreign Key セクションにある「Add」ボタンをクリックします。図のように設定することで、article テーブルの author_id カラムを author テーブル の id カラムへと関連づけます。

(訳注:reference table は、article テーブルから「どのテーブルに対して関連付けをおこなうか」を設定するための項目です。ここでは author を選んでいるので article テーブルを author テーブルに関連付けするよう設定しています。次に From:article テーブルの「どのカラムを用いて」author テーブルに対して関連付けを行うかを定義しています。ここでは article テーブルの author_id を用いることとしました。最後に To: の部分では、二つのテーブルを関連づける際に、article テーブルの author_id と一致する「author テーブルのカラムはどれか」を定義しています。つまりここでは To:author テーブルの id であると定義しましたので、結果として article テーブル内で author_id = 1 となる row においては、author テーブルのうち、author.id = 1 となる row の情報を合体させる、という指示をすることになります。詳しくは PostgresDB に対する SQL 操作の Inner Join を学習しましょう。)

Screen Shot 2020-07-31 at 18.09.08

In the console, navigate to the Modify tab of the article table. Click the Add button in the Foreign Keys section and configure the author_id column as a foreign-key for the id column in the author table:

Step 2: Create an object relationship

全ての artilce は必ずたった一つの author を持ちます。(訳注:現実世界では author が存在しないということもあり得ますし、author が二人以上いることもあります。しかし、今回定義したテーブル構造では、author が存在しないことも、author が二人以上のこともあり得ません。しかし author が 0 人以上になるようなテーブル構造を作りたい場合にはどうしたらいいのでしょうか?その場合には、author テーブルの側に foreign key を追加すればいいのです。具体的には author テーブルに対して article_id というカラムを新たに追加し、この article_id から article テーブルの id に対して関連付けをおこないます。こうすることで一つの article が0以上の author を持つ構造をつくりだすことができます。)

Each article has one author. This is an object relationship.

Hasura Console は上記のプロセスで作られた foreing key から推測をし、取り得る rerationship を Relationship タブ からおすすめしてくれます。

The console infers this using the foreign-key created above and recommends the potential relationship in the Relationships tab of the article table.

次の手順を実行し、article table に対して author という名称の object relationship を追加しましょう。

Add an object relationship named author for the article table as shown here:

Screen Shot 2020-07-31 at 19.00.51

さあこれで今作った object relationship にもとずいて nested obejct query を実行できるようになりました。

We can now run a nested object query that is based on this object relationship.

article の一覧を取得し、さらに各 artcile の author の情報も取得できるようになったことを確認しましょう。

Fetch a list of articles and each article’s author:

Screen Shot 2020-07-31 at 19.01.36