Notionのデータベース設計
去年もこの時期に、Notionのデータベースの話をしたんですが、今年もやります。
なぜかというと、今年もこの時期に通販のお手伝いをしているからです。
第564回のアシカガCASTで、顧客管理も売上計算もNotionのデータベース大活躍という話をしました。
その時に話したんですが、事前にちゃんと設計を考えずに構築したので、無駄が多かったというか、あまり賢い仕組みにはなってなかったんですね。
そこで今回はちゃんと考えて、商品DBと顧客DBをリレーションしようと考えました。
連動させるということですね。
実際作ってみると、商品DBと注文DBと顧客DBに分けた方がいいと考えました。
それぞれ別なDBを連動させるんですね。
そして商品DBにある商品の値段をもとに、注文DBでお買い上げの料金を自動で計算させたいということになります。
NotionのDBでリレーションというプロパティを使って、注文のDB上で商品DBにある商品を選んでいくと。
というところまではすんなりできました。
そして自動で商品DBの方にも、注文DBの誰がその商品を注文したかという内容も表示させることができます。
今回これも重要で、一点物の商品もあるので、その商品に複数の注文が入った場合抽選になるんですが、
商品DBの方で、その商品にいくつ注文が入っているかわかるので便利だということですね。
最終的には商品DB側でも、その商品に何個注文が入って金額がいくらになるかも表示できるようにしました。
商品DBと注文DBの連動
注文DBで商品DBから商品を引っ張ってきて表示をさせるというところはすんなりいったんですが、
いざ金額を計算させようというところで問題が発生します。
それは一つの商品を複数個注文したときに、その処理をどうしようということです。
データベースをリレーションして、片方のデータベースから片方のデータベースの情報を拾ってくるときに、
その商品を選ぶか選ばないかしかないんですよね。複数回選ぶとかいうことはないので、
商品が必ず1個ずつしか選ばれないんだったら、
ロールアップという機能を使って、リレーションした商品DBの値段を基に合計金額を計算することはできるんですね。
でも一つの商品を複数個購入したときのうまいやり方がわからないので、
結局力技で1個買った商品、2個買った商品、3個買った商品とそれぞれプロパティを分けて入力するようにしました。
結構力技なので、3個注文する人、4個注文する人と注文個数に合わせてプロパティを増やしていかないといけないんですが、
今回はなんとか5つのプロパティで収まりました。
合計金額は1個注文した商品の合計金額プラス2個注文した商品×2、3個注文した商品×3を全部足していくみたいなことで計算ができるようになりました。
ただ注文した商品が個数によってデータベース上の見た目の列が分かれるので、その一つの注文にどの商品が含まれているかの一覧性が悪くなってしまいました。
一つの商品を複数個注文した場合の処理
で、これは関数を使ってまとめて表示できるようにしました。
リレーションした複数の商品を関数から呼び出すと、かんま区切りのテキストになっていました。
かんま区切りだと読みづらいので、関数を利用してかんまを回用に変換しました。
で、その一覧に各商品の金額も入れたかったんですが、これは難しくて結局これも力技で、商品データベースの商品名の後にかっこ何円と金額を入れることで解決しました。
最終的には一覧に合計金額と、さらに送料も含んで、送料が必要な人の場合は送料も含んで表示されるようにしました。
何円以上購入したら送料無料という設定になっているんですが、購入した商品の大きさとかによって送料は変わってくるので、
ここは難しく自動計算にはしないで、送料無料、レターパックライト、レターパックプラスみたいな項目を用意しておいて、一個一個プルダウンで選ぶようにしました。
そのプルダウンの内容によって金額は自動計算されると。
そして最終的に各1個購入の商品、2個購入の商品、商品の名前とかっこ値段で最終的に送料無料か送料がいくらとあって合計金額いくらですというところまで自動でテキストを生成することができました。
私がお手伝いしているこの通販の場合、最終的に抽選結果として購入できる商品がこれになりましたとお客さん一人一人に連絡するので、その時にその注文内容のテキストをコピーペーストすればいいということで、我ながらよく仕組みができたなと思っています。
Notionで関数を使う上でのポイントをいくつか紹介しておきます。
まず基本は文字列をつなぐ関数ですね。
これExcelとかGoogleスプレッドシートとかMacのナンバーズでも共通なんですが、コンカティネート関数というものを使います。
Notionの場合はCONCATまでですね。
あと数字を計算するにはそのプロパティの型というのが数値になってないといけないですし、さっきのコンカティネート関数で文字列をつなげるときには型が一致してないといけないので数値を文字列にしないといけないんですね。
これも考え方としてはNotionのデータベースに限った話ではないですね。
Notionの場合数値を文字列にするにはフォーマットという関数を使います。文字列を数値にするにはtoNumberという関数を使います。
あと何でも一気にやろうとせず分けて処理していくのがいいんじゃないかなと私は思いました。
あとから足して足してとやっていったのでそうなったという面もあるんですが最初から全部の計算をしてしまうんじゃなく
1個の商品の合計の金額を出して2個の商品の合計の金額を出してそれらの金額を全部足した金額を出してさらに総量の金額をプラスしてと
一気に一つのプロパティの関数で全部計算してしまうのではなくて分けて分けてやっていきました。
そうすると途中計算のためのプロパティとかがどんどん増えていってしまって見た目がごちゃごちゃしてしまうんですが
Notionのデータベースでは必要のないプロパティは非表示にできます。
作ったデータベースは人に見てもらう必要があるケースが多いと思います。
今回のデータベースもITリテラシーの低い人たちに見てもらう必要がありました。
NotionのデータベースはViewというものを複数追加して見た目を変えていくことができます。
表形式じゃなくてカード形式とかカレンダー形式とかいろんな表示もできるんですが今回は表形式だけです。
ただ先ほど言ったように表示するプロパティを絞って分かりやすい表示にしました。
その時に新しいViewにするとデータベースの一つ一つの項目の並び順が変わってしまうという問題が出ました。
これはしょうがないので通し番号を入れるようにしてその番号順に相当させるようにしました。
Notionでは新しいページを作ってそこに既存のデータベースを表示させることができるんですが
Linked Viewとしてデータベースを表示する機能があります。
この機能を使うと特定のViewでだけデータベースを埋め込めるので人に見てもらうときに便利だなと思いました。
頑張ってなかなかいいデータベースが構築できたなと思ったんですが結局これ構造が分かっている私しか使えないよなという風にも感じました。
今回は以上です。足利浩二がお届けしました。