Creating relationships / Hasura ドキュメント翻訳
TweetIntroduction
ある 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 を学習しましょう。)
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:
さあこれで今作った 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:
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:
Step 2: Define the relationship
すると以下のような画面が開かれます。
The above step will open up a section as shown below:
今回のケースであれば次のように設定しましょう
Relationship Type
をObject Relationship
にRelationship Name
は例えばavg_rating
にReference
はid -> 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: