原文

Introduction

二つのテーブル間の「多対多 = many-to-many」の関係性は、bridge/junction/join table(日本語では中間テーブルと呼ばれることが多い)と一般的に呼ばれるテーブルを作成し、そのテーブルから、元のテーブルに対して foreign key 制限 = foreign key constraint を加えることで実装することができます。(訳注:例えば article と category があり、article に複数の category 所属する場合、これは多対多の関係と呼ばれる。この場合には中間テーブルとして article_category を作成し、このテーブルから article と category に対して foreign key constraint を加えることで、紐付けることができる。)

A many-to-many relationship between two tables can be established by creating a table typically called as bridge/junction/join table and adding foreign-key constraints from it to the original tables.

では以下のような二つのテーブルを想定します。

Say we have the following two tables in our database schema:

article (
  id SERIAL PRIMARY KEY,
  title TEXT
  ...
)

tag (
  id SERIAL PRIMARY KEY,
  tag_value TEXT
  ...
)

これらのテーブルが many-to-many relationship の関係を持つようにします。

These two tables are related via a many-to-many relationship. i.e:

つまり

  • ある記事 article は複数の tag を持ちます
  • ある tag は複数の記事 article を持ちます
  • an article can have many tags
  • a tag has many articles

Step 1: Set up a table relationship in the database

このような many-to-many relationship はデータベースに以下の操作を加えることで実装できます。

This many-to-many relationship can be established in the database by:

  • 以下の構造を持つ article_tag という名称の中間テーブルを作成します
  • Creating a bridge table called article_tag with the following structure:
article_tag (
  article_id INT
  tag_id INT
  PRIMARY KEY (article_id, tag_id)
  ...
)
  • foreign key constraintarticle_tag から以下二つのテーブルに対して追加します

    • article テーブルに対して、article_tag テーブルの article_idarticle テーブルの id が一致するように
    • tag テーブルに対して、article_tag テーブルの tag_idtag テーブルの id が一致するように
  • Adding foreign key constraints from the article_tag table to:

    • the article table using the article_id and id columns of the tables respectively
    • the tag table using the tag_id and id columns of the tables respectively

そうすることで article_tag が二つのテーブルの間を取り持ち、many-to-many relationship を形成してくれます。(訳注:and captures possible permutations of their association via the foreign keys が正確にわからない。)

The table article_tag sits between the two tables involved in the many-to-many relationship and captures possible permutations of their association via the foreign keys.

Step 2: Set up GraphQL relationships

GraphQL API から nested object としてアクセスできるように、以下の relationship を作成しましょう。(訳注:デフォルトで以下の提案が出るので、何も考えずに OK を押してしまっても問題ないです)

To access the nested objects via the GraphQL API, create the following relationships:

  • Array relationship, article_tags from article table using article_tag :: article_id -> id
  • Object relationship, tag from article_tag table using tag_id -> tag :: id
  • Array relationship, tag_articles from tag table using article_tag :: tag_id -> id
  • Object relationship, article from article_tag table using article_id -> article :: id

Step 3: Query using relationships

ここまでの作業で、article のリストとそれに付随する tag を同時に取得できるようになりました。

We can now:

fetch a list of articles with their tags:

Screen Shot 2020-08-17 at 18.03.22

tag のリストとそれに付随する article を取得するには以下のようにクエリを発行します。

fetch a list of tags with their articles:

Screen Shot 2020-08-17 at 18.04.12

Fetching relationship information

中間テーブルである article_tag に、例えば tagged_at というカラムを追加することで、この「このタグがいつ付与されたか」という、関係性以外の、さらに詳しい情報を取得することができます。この場合以下のクエリで情報が取得できます。(訳注:元の文章をそのまま翻訳するとよくわからなかったので大幅に文章を変更)

The intermediate fields articletags & tagarticles can be used to fetch extra information about the relationship. For example, you can have a column like taggedat in the articletag table which you can fetch as follows:

Screen Shot 2020-08-17 at 18.11.56

Flattening a many-to-many relationship query

訳注:利点より欠点の方が多いためおすすめしない、とドキュメントに書いてありますので翻訳は保留します。