Modelling many-to-many table relationships / Hasura ドキュメント翻訳
TweetIntroduction
二つのテーブル間の「多対多 = 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 constraint
をarticle_tag
から以下二つのテーブルに対して追加しますarticle
テーブルに対して、article_tag
テーブルのarticle_id
とarticle
テーブルのid
が一致するようにtag
テーブルに対して、article_tag
テーブルのtag_id
とtag
テーブルの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
fromarticle
table usingarticle_tag :: article_id -> id
- Object relationship,
tag
fromarticle_tag
tableusing tag_id -> tag :: id
- Array relationship,
tag_articles
from tag table usingarticle_tag :: tag_id -> id
- Object relationship,
article
fromarticle_tag
table usingarticle_id -> article :: id
Step 3: Query using relationships
ここまでの作業で、article のリストとそれに付随する tag を同時に取得できるようになりました。
We can now:
fetch a list of articles with their tags:
tag のリストとそれに付随する article を取得するには以下のようにクエリを発行します。
fetch a list of tags with their articles:
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:
Flattening a many-to-many relationship query
訳注:利点より欠点の方が多いためおすすめしない、とドキュメントに書いてありますので翻訳は保留します。