どーも!
たかぽんです!
最近以前書いた記事でDBついて書いたもののアクセスが増えてきているのですが、結構マイナーなリレーションの使い方をしているため、改めてわかりやすい例で書いておこうと思います...!
Notionのリレーションとは?
簡単に言うとリレーションを貼ることで二つのDB間の値を関係づけて使うことができます。
公式の解説では以下のページに記載されています。
今回はリンク先のNotionの解説に合わせて日本語でわかりやすい感じでご説明できればと思います...!
試してみましょう...!
Notionのリレーションを試す...!
ではやっていきます!
- 顧客一覧テーブル
- 商品一覧テーブル
公式に合わせて、上記二つのテーブルで想定していきます。
まずは以下、二つのテーブルを作成します。
イメージとしては商品テーブルが扱っている商品一覧、そして顧客テーブルがその商品を購入するユーザー一覧...といった形をイメージしています。
今回は確認がしやすいようにinlineでテーブルを二つ同じページ内に作っています。
さて、ではここでこの二つの関係(リレーション)を定義することによって、どのユーザーがどの商品を購入したのか?がわかりやすいようにしていきます。
商品テーブルでRelationのカラムを追加します。
商品テーブルの上部(カラム名の行"Name , Tags, 等のあるところです)にある+ボタンからカラムの追加ができます。
Relationを選択すると以下のような画面が出てきます。
データベースのリレーションにはもう一つのデータベースが必要になります。
それをここで指定する必要があります。
"Select a database"を選択して"顧客"で検索すれば先程作った顧客テーブルが出てきます。
(page名も見れるので、同じdatabase名があった場合はpage名で判断してください)
選択したら"Create relation"を選択します。
すると、右上を向いた矢印のカラムが商品テーブルに追加され、顧客テーブルに"Relation to 商品テーブル"が追加されます。
これでリレーションの定義は完了です...!
では実際にリレーションを試します...!
以下動画作ったのでご覧ください...!
準備ができていれば上記のように動作するかと思います。
一点、リレーションを選択後、追加したい場合、選択済みのリレーション意外の値が出ないのですが、検索欄をクリックすればちゃんと出てくるのでそこはご注意ください(14秒あたりで行っています)。
例えば、たかぽんが鉛筆、消しゴム、定規を全て購入したならば商品テーブルのリレーションには全てたかぽんが入っていて、顧客テーブルでもたかぽんが三つ購入していることになります。
このように、A, B二つのテーブルの間で関係を定義することをRelationと言います。
例えばプロジェクトテーブルで今やっている大タスクを定義、そして小タスクを別途定義したとすると...
そのプロジェクトごとの小タスクを紐づければ小タスクからはどのプロジェクトのタスクか、そして大タスクからはその内訳として小タスクの一覧がみれたりしますね。
また、メンバーテーブルと部活動一覧テーブルがあればどのメンバーがどの部活動に入っているのか?がわかりやすいテーブルもできそうです。
Relationがなんなのか理解できてきたかと思います...!
それではさらにもう一つ深堀してみます...!
ユーザーごとの支払い料金を出す
先程せっかく顧客ごとの購入商品一覧を出しました。
次は商品に適当な価格をつけて顧客ごとの料金を計算してみようと思います...!
少しややこしくなりますが、ここが理解できればデータベース、リレーションの利便性が倍以上に上がります...!
是非理解してみてください...!
まず、商品テーブルに料金用のカラムを追加します。
今回はデフォルトで存在していたTagカラムを書き換えようと思います。(新規で追加でもOKです。)
料金をつけるべきなのは商品なので、商品テーブルのTagsに対して、名前をPriceとつけて、Property typeをNumberに変更します。
Numberは料金や個数などの数値を扱いたい場合に便利です。
追加したら、適当な値(今回は100,200,300で入れています。)を入れます。
ついでにPriceの中身へマウスを合わせた際に出る"123"のボタン(#のしたあたりです)を押して、単位もつけておきましょう。(日本円はyenです)
ここまでできれば下準備は完了です。
今度は、顧客テーブルの方でRollupと言うプロパティを使います。
これは、虫眼鏡マークからわかりますが、リレーション先の値をいい感じに集計して見ることができるカラム...とでも思って貰えばいいでしょう。
今回の場合はリレーションに従ってリレーション先(商品テーブル)の料金を足し合わせ、その合計を表示することができます。
数字を扱う場合に簡単に使えるものだと...和、平均、中央値、最小値、最大値、最大-最小、などなども出すことが可能になっています。
では実際に作ってみます。
顧客テーブルのTagsカラムを書き換えます。
カラム名はPaymentと変えておき、Rollupプロパティを選びます。
すると、以下のような小難しい画面が出てきます...
一つづつ説明すると、RelationはどのリレーションをこのRollupとして使用するのか?を選択します。
ここで選択するのは同じ顧客テーブルのリレーションです。
選択肢を見ればわかると思いますが、今回は顧客テーブルにある"Related to 商品テーブル"リレーションを指定します。
そして、二つ目のPropertyはリレーション先のどの値を対象に集計するのか?を選択します。
つまり、商品テーブルのどの値をこのRollupカラムで集計して表示したいのか?を選択します。
今回は商品テーブルの料金を合計して表示したいわけなので、先程作ったPriceプロパティを選択します。
そして、最後のCALCULATEはどういった演算を行うのか?を指定します。
これは、今回は料金の"和"を出したいので、Sumになります。
先程直前で指定したプロパティがNumberのプロパティであれば、Sumを指定することで和を表示することができるわけです...!
Averageにすれば平均が、Medianであれば中央値が...といった具合ですね。
部署テーブル、社員テーブルがあり、社員テーブルの年齢プロパティを作ってここでAverageを指定すれば部署ごとの平均年齢...とかも出せそうですね。
今回は和なのでSumを指定します。
ここまでできれば完成です...!
あとは試しに"たかぽん"が三つの商品を買ったとすると...
600円になってますね...!
このように、リレーションを使って、リレーション先の値の和や平均、中央値などをRollupで表示することで、よりリレーションを有効に活用してデータベースの値を分析したり、表示したりできるようになります。
このRollupが理解できた方はリレーションでどんなことができるのか、ある程度想像できるようになったのではないでしょうか...?
今回の例だと、さらに顧客属性テーブル...的なものを用意し、顧客テーブルとリレーションをはり、男性、女性、居住地、年齢等の情報があれば、男性、女性、居住地ごと、年齢ごとの平均購入額なんかも出せそうですよね...!
リレーションが増えると複雑にはなっていってしまいますが、それだけ良い使い方ができればめちゃくちゃ便利になります...!
さらに複雑なことをやると...
さて、さらに複雑なことを行うと筆者が最初に書いた記事のようなこともできるようになります。
formulaというプロパティを使うことでより柔軟に値を計算した後、そのformulaプロパティの値をRollupして値を出す...等です。
例えば...作成日時が一定範囲のものだけ指定して合計を出す〜といったことも可能になります。
(リレーションの説明として記事化してしまっていますが、あんまり適した内容ではないにもかかわらず思ったより閲覧していただいていて、いまさら後悔...w)
詳しく知りたい方は是非、以下の記事をご参考ください。
まとめ
さて、今回はリレーションについてみていきました!
このリレーションが使えるだけでDBの使い方はめちゃくちゃ便利になります...!
理解した方はいろんなことできるじゃん...!と感じたのではないでしょうか...?
基本さえ理解すればあとは自分のやりたいことベースにそれを手元で作ってみるといいかと思います。
是非お手元で試してみてください!
それでわ!