【Hasura】導入に際して気をつけること。DB設計など

こんにちは、フリーランスエンジニアの太田雅昭です。

Hasura

HasuraはGraphQLを用いたエンドポイントを簡単に作成してくれます。具体的には以下の点で、優れていると考えられます。

  • SubscriptionでDBの変更をリアルタイムで検知できる
  • Permissionでロールベースなど細かい制御が可能

他にもいろいろあるかと思いますが、しばらく使ってみての所感では、特に上記の点で優れていると感じます。

導入に際して気をつけること

Hasuraでは、特に以下の点に気をつける必要があります。

ポリモーフィックは避ける

ポリモーフィックはDB設計で、同じテーブル構造を使い回す手法です。例えばエンティティーAに関する翻訳と、エンティティーBに関する翻訳があったとします。翻訳テーブルは locale, key, textといった定番のフィールドがあるため、A, B共通で1つのテーブルを使いまわそうとするものです。以下のような具合です。

model PolyTranslation {
  id Int
  entityType String
  entityId Int
  locale String
  key String
  text String
}

このようなテーブルを1つ作るだけで、entityTypeとentityIdの組み合わせで、A, B両方に対応できます。

ただしこうしたポリモーフィックは、Hasuraでは向いていません。なぜならHasuraのPermissionはリレーションによって行います。そのため、リレーションがなければPermission機能を十分に発揮できないことになります。

ポリモーフィックに限らず、できるだけリレーションを繋げたDB設計にするのが望ましいです。

とにかくidフィールドをつける

idフィールドはテーブルに不要な場合があります。しかしHasuraでは大体は、Apollo Clientを使用することになるかと思います。Apollo Clientでは、idフィールドを使用して、キャッシュの調整を自動で行なってくれます。そのため、idがないとキャッシュ機能がうまくいかず、エラーメッセージが流れ続けることになります。idとするフィールド名を指定する方法もあるかもしれませんが、面倒なので最初から全てのテーブルにidフィールドをつけるのがいいかと思います。

以上、Hasura導入に際して気をつけるべき事象をまとめてみました。また気づいたことがありましたら、更新します。

余談

Youtubeで見たのですが、スターバックスはグァテマラブレンドだそうですね。私も店をやっていた頃は、最高級のグァテマラを少し混ぜていました。業者さんがだいぶ安くしてくれていたので助かりました。ただグァテマラだけだと、ちょっと物足りないんですよね。なのでブレンドが良い感じです。