見出し画像

これで分かる!多対多リレーションの実現方法【ノーコード・ツールGlide】

テーブル間の多重度が、多対多の関係のままリレーションを実装してしまおう、というお話しを前回しました。今日はその続きでございます😄!

中間テーブルを使わず、多対多のテーブル間でリレーションを実装する!?果たして、どうやるのか?気になる方は、先を読みましょう!

テーブル設計、それでいいのか!?

ユーザーの一覧と動物の一覧の間で、リレーションを組むのでしたね。まずは、データを確認しましょう。動物のGoogleスプレッドシートから。。。

うーん、普通のテーブルですな。。。動物の属性が3つ、淡々とならんでいるだけですねえ🤔。

では、ユーザーのテーブルです。ほほ~、「好きな動物」をユーザーテーブル上に持たせたわけですね。

なるほど!と言いたいところですが、ここに問題があるんです。

「好きな動物を10個登録したい人がいたら、5つめ以降は登録できないんじゃないですか?😅」

う、おっしゃるとおり…。アプリ上で「選べる動物は4つまで!」と指定してまえばいいのでしょうが、選べる数に指定しにくいこともあるでしょう。例えば、「持っている資格」とか?20個くらいある人がいるかもしれないです。そしたら、「資格」列を20個分用意するの?となります。

まだ、問題があります。「好きな動物」列をもっと増やしたらテーブルのセルが「空白(null)」だらけになるのです。例えば、「好きな動物10」まで増やしたとしましょう。でも「好きな動物10」列に値が埋まる人って、ほとんどいないんじゃないでしょうか??

好きな動物列を増やしても、空白だらけになる

うーん、ちょっと問題のあるテーブルの作りですね。。。それもそのはず、テーブル設計では、「1つの属性に複数のカラムを持たせる」というのは、NGなんです。列方向へカラムの繰り返しがある(またはセルに複数の値が入っている)ので、このテーブル設計は、第1正規形すら満たせていない非正規形となってしまいます😲。非正規形?ようは、テーブルの状態として不適切ですよ~と思ってください。

これを避けるために、中間テーブルを使う「はず」でした。でも、今回は、、、このまま突っ走ります!選択できる「好きな動物」に限度ができてしまう(今回は4つ)のですが、それが許容できるなら、まあ、、、いいじゃないですか!

Googleスプレッドシートの状態は分かりました。では、データエディタはどうなっているでしょう?

アレイ・カラムがカギだった

データエディタ上での、ユーザーテーブルは、次のようになっています。

あれ、好きな動物が一つのカラムに収まっている?これって何でしたっけ?そう、アレイカラムです。複数のカラムをひとまとめにしたものです。Googleスプレッドシートで列名称を「共通の文字列+半角数字」とすると、データエディタ上で自動生成されます。

実は、このように複数のカラムを「えいや」と一つにしてしまうことによって、リレーションが組めるようになるんです。

ユーザーテーブル側でリレーションカラムを作ります。外部キー(テーブル間の紐づけのためのカラム)は、アレイカラムを指定しましょう!参照先は「動物」列ですね。

無事、好きな動物のアイテムと紐づけられました。

続いて「動物」テーブルのリレーションカラムも、同様に、動物のカラムを指定します。

はい、その動物が大好きなユーザーさんの情報と紐づけられました!

リストをリレーションカラムと紐づける

あとは、アプリで設定するだけです。

下のように、山田さんが好きな動物の一覧を表示させたいです。

インラインリスト・コンポーネントを設置します。これはいいですね。

そして、その紐づけ先として、、、リレーションカラムを設定します。ここがミソです!

動物の詳細画面も同様ですよ!

インラインリスト・コンポーネントを設置します。

そして、データソースをリレーションカラムにします。

これで出来上がり!おつかれさまです😄。

まとめ

一応まとめますか。

・多対多の関係のテーブルは、原則として、1対多に変換する。
・その転換のために、「中間テーブル」を使う。
・多対多のままリレーションを組もうとすると、属性値の繰り返しが発生し、適切なテーブル設計とならない(本当は)。
・ただし、選べる属性値の数を指定できるなら、多対多のままでも大きな支障はない。
・Glideではアレイカラムを生成されることで、多対多のままリレーションを組める

となります。

まとめが長いな~😅。まあ良しとしましょう!

では、ビーダゼーン!

※私のやる気アップとブログの品質向上につながりますので、記事が気に入られた方は、「ポチっ」と好きボタンを押してくださったり、フォローいただけますと幸いです🙇。


この記事が気に入ったらサポートをしてみませんか?