目次
データベースのリレーションとは・・・?
追記 2021/5/13
最近本記事を結構たくさんの人がみてくれている気がしますが、内容が結構複雑な例でリレーションの解説をしています。
そのため、別途基本的な部分を解説した記事を書きました。
基本を理解したい方は本記事より、以下の記事をご参考いただく方がおそらく理解しやすいと思いますので是非...!
データベースのリレーションを理解しよう!
さて、今までは簡単なブロックの使い方ばかりみてきました。
今日はnotionのつよつよな機能、Databaseをみていきます!
いきなり応用的な内容になってしまってもうしわけないんですが...
今回はデータベースのリレーションについてみていきます!
悪くないusecaseを思いついたので、鉄は熱いうちに打てということで、早速執筆を。
基本的なDBの使い方もすぐに執筆できればなぁと...
で!
今回みていくリレーションなんですが、複数のDB間で関連付けをすることができる様になります!
(別のDBで別のDBの値を使ったりできるんです!)
詳しく説明するととてつもなく複雑になってしまいそうなので、簡単なユースケースに合わせて説明します。
今回作成するのは、
”自分の年間目標DB”, "読書リストDB"を用意して、読書リストDBでタグをDONEにすると、目標DBの読了済項目を1追加する”
ということをやってみたいと思います!
言葉だとわかりづらいので、ちょっと動画を用意しました。ご覧ください。
簡単な説明しとして、年間目標DBにて、本を100冊読むという目標を立て、その目標数と、読んだ本の数で現在の進捗具合を%で表示しています。
そして、別のDB(読書リスト)にて書籍を読了済を表す"Done"にしたら、その進捗が進むといった感じです。
まだ、僕自身噛み砕けていない箇所も多々有りますが、こんなこともできんだなぁ〜程度で聞いてもらえればと思います!
内容的に、ちょっと中級者向けになります...(数式とかも出てきます...)
筆者はアメリカンに色々なパラメータ書きたい派なのですが、日本語チックなパラメータで解説する様にしておきます。(多数派は日本語メインだと思いますし...お寿司...
では、みていきましょう!
目標管理DBをリレーションを使って作ってみよう!
長くなってしまうと思いますが、やっていきましょう!
DBを二つ作成する
では、早速、DBを作っていきます。
場所はどこでも大丈夫です。(同じページ内だとみやすいかも)
名前も適当でいいですが、今回はこれから読みたい本や、読んだ本の情報を詰め込んでいく”読書リストDB”と一年間の目標をまとめておく”年間目標DB”を用意します。
さて、上記の様に二つのDBを追加できたらOKです!
テスト用データを入れておく
さて、それではテスト用のデータを入れていきます。
今現時点で箱だけ用意されているので、中身を入れていくイメージですね。
あとは日付を特定するため、"createdday"を追加します。
必要ないですが、っぽく見せるため、"Tags"の名前も変えておきましょうか。
で、これまた必要はないですが、今回は"files"を使用しないので、削除しておきます。
さて、ちょっと脱線しましたが、次は年間目標DBに行きます。
例では100冊でやってたので、今回は30冊にしてみます。
先ほどの例では、Textで目標数値を入力していたのですが、今回はNumberでやってみます。
最初っからあるtags, filesは削除(delete)して、+ボタンを押し、以下の画像の様にNumberを追加します。
あとはNumberの目標を書いた列と同じ列に30と記入しておいてください。
さて、下準備はこれでOKです!
リレーションを作る
さて、では次にリレーションを作ってあげましょう。
このように自分のDB(年間目標DBで作ろうとしているので、年間目標DB)から別のDB(今検索して探している読書リストDB)へのRelationを追加することができます。
僕の場合、おんなじDBの名前(読書リスト)が二つ有りますが、基本的には一意に名前をつけるべきですね...w
もしも二つある場合は下のパスから判断して適切なDBを選択してください。
できたらこんな感じになるはずです。
さて、この時点で関連付けの土台ができました。
次に、年間目標テーブルの方で追加された項目にて、実際の関連付けを行います。
押し終えたらこの枠外をクリックして戻ってきましょう。
これでリレーションが貼れました!(年間目標DBにて読書リストの"未読の本、読書中の本、読了済の本”のカラムの値が使える様になりました!
せっかくなので、簡単に確認してみましょう!
選択したら、値を追加します。
すると...?
これは、どのリレーションの、どのプロパティの値をどんな風に表示するかを選ぶことができます。
今回、読書リストの"未読の本、読書中の本、読了済の本”のカラムの値を参照できるリレーションの、読了状態プロパティの値をそのまま表示させてみます。
つまり、リレーションで読書リストDBの三冊分参照できるようにしていて、その三冊分の読了状態のプロパティの値を年間目標DBにてそのまま表示してくれているわけです。
これがリレーションで別のDBの値が使えるよ〜ってことです。
次は...、2019年にcreateされた本で、読了済の本だけ見分けて、その合計値を年間目標DBに表示しましょう!
ちょっと難しくなっていきますが頑張りましょう!
2019年に読了された本を調べる
さて、今回は年間目標なので、2019年に読んだ本の冊数を調べてみます。
注意して欲しいのが、今回の手法では”厳密に”2019年に読まれた類型冊数を計算できません...
それについては、また最後の方で解説しようと思います。
では、読書リストをいじっていきましょう。
ここで、読了状態が"読了済"のものを調べて、読了済になっていたら数値の"1"を返す様なカラムを追加していきます。
さて、ここで"Formula"というものがでてきました。
これは簡単にいうといろんな”計算”を行ってくれます。
プログラミングに見識のある方は関数と思ってもらえるといいです。
また、一般的な計算とは違い、文字列同士の結合やif分での条件をつけたり...と、結構色々できます。
今回は"Createddayカラム"の年が2019になっていて、尚且つ"読了状態カラム"の値が"読了済"になっているものを”2019年に読んだ本”と定義して、その場合は1の値を、そうでないなら0を表示する様にします。
ここに関しては詳しく説明するととてつもなく長くなってしまうので...詳細は割愛させてください...
(また別記事にて具体的な組み立て方とか、書ければなぁ...と...)
カラム名を僕と全く同じ形で作ってくれていれば、以下のものをコピペしてもらえればきっと大丈夫...なはず...(わからなければお気軽にコメントしてください〜!
and(equal(year(prop("Createdday")), 2019), equal(prop("読了状態"), "読了済")) ? 1 : 0
ちなみに、もう残り少ないですが、2020年になってからは上記だとうまくいかないので、今の年数に合わせて、上記の"2019"の箇所を書き直してください。
さて、それでは記入を追えたら確認してみます。
さてこれで2019年に読了したかどうかが一目でわかるようになりましたね!
あとでこの値を全部足してあげればいい感じに2019年に読んだ本の冊数になりそうですね!
さて、最初に"厳密には今回の手法では2019年に読了した本の累計を求められない"と言いました。
それについて触れておこうと思います。
実は、現在みている値は"Created Time"カラムです。
これは、そのデータが作成された日時が入る様になっています。
つまり、2018年の12月30日にその本に関するデータを作成(create)して、その後2019年に読了した場合、そのカラムは2018年に読了した本としてカウントされてしまいます。
運用でカバーするのであれば、例えば...
- 読了したタイミングで本のデータを追加するようにする
- Read Dayカラムに読了したタイミングの日付を毎回入力し、それを参照する
等でしょうか...
毎回読了したタイミングで専用のカラムに日付を入力すればもちろんですが、読了したタイミングでデータを追加するようにすると、確かにCreated Timeには読了時の日付が入るわけなので、うまくいきそうです。
ただ、読了したタイミングで本のデータを追加するなら、未読の本や読了中の本は別で管理しなければいけないですし、別の専用のカラムに読了したタイミングで毎回日付を入力するのは面倒です...タグを書き換えるのならまだしも...。
っというわけで、現状多少の誤差はでそうですが、前述の手法を使っています。
年間目標DBで冊数を確認しよう!
さて、次は年間目標DBで年間に読んだ本の冊数を計算しましょう!
実はさっき、少しだけ触っていましたが。
rollupというものを使って実現ができます!
さっきはこんな感じにしてましたね!
これを、こうします!
すると...?
"1"と表示されていますね。
これだけだとよくわからないので、試しに読書リストの"読書中"を"読了済"にしてみましょう!
読了済に書き換えただけですが...
詳しく見ると...
さらにさらに...?
わーい!
さて、それではおまけに現在の進捗を計算しましょう。
目標の数値と現在の数値から進捗度合いを表示させる
計算式はこんな感じ
divide(prop("読了済の冊数"), prop("Goal Num"))
さて、100冊の時はなんら問題なかったのですが、30冊(割り切れない場合がある場合)はこうなりますね...。
ちなみに、現在の進捗の項目にカーソルを合わせると、%表示にすることができます。(0.01なら1%, 1.0なら100%に表示変更)
んー・・・なんかやっぱ見栄え悪いですねぇ〜...
いい感じにしたいですねぇ...
うん、しましょうか。
厳密に数値に決まりがあるならそれに従ってどんな処理(四捨五入?小数点以下切り捨て...?)をするか決めるべきです(なんらかの実験やベンチマークなどの計測値等)が...
あくまで個人の目標管理なので、今回は6.7%とでも表示するようにしてみましょう(小数第二位を四捨五入)。
変えるのは先ほど書いた"Formula"です。
以下画像のようにすれば良さそうです。
divide(round(multiply(divide(prop("読了済の冊数"), prop("Goal Num")), 1000)), 1000)
今やってみて思いましたが...
用意されていたround関数(四捨五入するやつ)は少数以下をroundしてしまう様でした。
つまり、整数だけ残る様に少数第一位を切り捨て、切り上げされているようです。
で、今回の数値は0.066...なので...そのままroundかけると0になります。
また、表示する場合にのみ適応されるんですが、%表示(100倍された状態)するので、この場合、元の0.0666のうち...100倍したときの6.66の最初の6が整数箇所、その次が少数第一位、その次が少数第二位になります。
少数第二位でroundをしたいわけなので、一旦本の数(千倍)66.6...にして、roundをかけると、67になります。
それをさらに0.0067に戻してから%表示をすることによって、6.7%になる様にしています。
ややこしいですねぇ...
正直理解できていない方もいるかもですが...
なんとなくとりあえず6.7になるんやな!って感じでいいかと思います...w
より実用的にする
さて、基本的なことはもう説明した通りなんですが、もうちょっと実用的にしてみます。
リレーションを追加したのは3冊でした。
これって、後から追加したやつに関してはその都度リレーションを追加しないといけないんですね...
ちょっとそれじゃ面倒臭いですよね...
そこで!テンプレートで作るたびにリレーションを貼ってしまおう!
っていう感じです!
これに関しては動画で解説をしているので、そちらをご覧ください!
こうすることで、未読の本を追加、読み終えたら書評に合わせて読了済に書き換え->自動的に目標数値が更新される様になりますね!
本手法の欠点
今回、読書リストの本のタグを書き換えて目標のDBの値を自動で更新できる様にしました。
しかしながら、この手法には大きな欠点が有ります...
それは...
もう一つ年間目標に別の目標を立ててみるとわかると思います。
読了済の冊数はあくまで読書リストのものであり、例えば今まで読んだ記事のリストがあって、その記事の読了数も目標にしたい場合、それらは別のカラムになってしまうんです。
読了済書籍数、読了済記事数といった形です。
そして、その値を計算する際の現在の進捗も本の冊数に依存しているので、二つ作らなければいけません...
そうすると、別の目標ではそこが0になってみづらいですし、カラムの数がヤバいことになってしまいます。
Formulaで縦に違う数式を埋め込めたり、できると実現できそうですが...、もうちょっと考え直す必要がある様です。
今パッと思い浮かぶ分だと、大目標(本を100冊読む!的な)ごとに新しいDBを作り、そのDBをまとめたページを作るとかですかね...(ただ、わざわざ分けてしまうとせっかくオールインワンで一箇所に集めたいのに...本末転倒な気もしますね...
まとめ
さて、今回お話しした内容を使えば、同様に日々のタスクとか、そういうのにも応用は聞くと思うので、皆さんもいろんなユースケースを考えて使ってみてください!
まだ所々痒いところもあったりする(欠点の箇所や、Formulaでnumberからstring変換できなかったり...)んですが、比較的便利な使い方もできそうです!
ちょっと難しくは有りますが、試行錯誤してみてくださいね!
それでわ!