原文

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

Using manual relationships

手動で Relationship を生成するケースをみていきましょう。author (id, name) というテーブルと author_avg_rating (id, avg) という view があるとします。author_avg_rating view、各 author の「記事評価の平均」を表す View です。

Let’s say you have a table author (id, name) and a view authoravgrating (id, avg) which has the average rating of articles for each author.

では avg_rating という名称の object relationship を手動(manual relationship)で作っていきましょう。この relationship は author テーブルから author_avg_rating に対して関連付けをおこないます。

Let us now create an object relationship called avgrating from the author table to the authoravg_rating view using a manual relationship:

Step 1: Open the manual relationship section

  • Console を開いて Data -> author -> Relationships タブへ移動する。
  • Configure ボタンをクリックする。
  • Open the console and navigate to the Data -> author -> Relationships tab.
  • Click on the Configure button:

Screen Shot 2020-08-10 at 23.49.15

Step 2: Define the relationship

すると以下のような画面が開かれます。

The above step will open up a section as shown below:

Screen Shot 2020-08-10 at 23.56.28

今回のケースであれば次のように設定しましょう

  • Relationship TypeObject Relationship
  • Relationship Name は例えば avg_rating
  • Referenceid -> author_avg_rating . id(これは foreign-key と同じ考え方です)

In this case:

Relationship Type will be: Object Relationship Relationship Name can be: avgrating Reference will be: id -> authoravg_rating . id (similar to defining a foreign-key)

Step 3: Create the relationship

Save ボタンを押して relationship を作成しましょう。

Now click on the Save button to create the relationship.

すると今作成した object relationship にもとづいて nested object query を実行することが可能です。

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

Author テーブルの情報と一緒に、その authort の平均評価も取得できるようになりました。

Fetch a list of authors with the average rating of their articles:

Screen Shot 2020-08-11 at 0.00.58