Airtableのデータベース設計例〜ウォレットを作る〜
コードの書けないエンジニアのたかしです!今回はAirtableを使ってユーザーの所有ポイント(ウォレット)を生成する工程を解説していきたいと思います。こちらの記事の前提知識として以下Airtableのフィールド28種類についてまとめた3つの記事があります。そちらを理解した上で読んでいただけると、より理解が深まるかと思います。
この記事を作るのにサポートして頂いたNo Code Campのメンバーさんに感謝いたします。No Code Camp には質の高いノーコードの情報が数多く蓄積されています。ノーコードに関して、ググって出てくる情報の何倍も良質な情報です。ページに定員が200名だと書いていたのでお早めに。
当初のアイデア
以下のように設定しました
Primary Fieldをオートナンバーで一意の値にする
ウォレット所有者:ユーザー情報にリンクしたフィールド
購入ポイント:ポイントショップテーブルにリンクしたフィールド
獲得ポイント:獲得ポイントテーブルにリンクしたフィールド
消費ポイント:消費ポイントテーブルにリンクしたフィールド
リンク先のPrimary Fieldは処理したい値にする
フォーミュラフィールド「ウォレット残高」でSUM関数を用い、(獲得ポイントの合計)+(購入ポイントの合計)ー(消費ポイントの合計)を計算しました
【結果】ウォレット残高がおかしい
ウォレット番号1番のレコードを計算すると10000+500-300-1000=9200となるはずですが10500となってしまいました
ちなみに他のテーブルの設定は以下
各レコードのprimary fieldに同テーブルのカレンシーフィールドの値を代入しています
先ほど書いた通り、ウォレットテーブルでは「購入ポイント」「獲得ポイント」「消費ポイント」のレコードデータをSUM関数を用いてそのまま足している状態になっています
これでウォレット残高が出るだろうと思っていましたが値が正しく返されませんでした。色々といじってみた感じ、各フィールドのレコードリンクが複数になったときエラーが発生し、0が返されると言う状況になっているようでした
このエラーを直して正しく表示させるアイデアが2つありますので紹介します。
【手法その1】 リンク×ルックアップ×SUM関数
ウォレット残高が正しく表示されています
さてどこを変更したのでしょう?
ウォレットテーブルをみると明らかにフィールド数が増えています
ルックアップでリンク先のテーブルからカレンシーフィールドの値を引っ張ってきて、ウォレットテーブルに追加したのです
なぜこのような面倒な処理を行ったのかというと、リンクレコードはあくまでも”飾り”のようなものだからです。リンク自体を関数で処理すると正しい値を返さないことがあるようなのです。ちなみに他のテーブルは以下のように変更しました。
他のテーブルの変更点はprimary fieldをオートナンバーで一意の値に設定。これだけです。
ルックアップしたフィールド「購入データ」と「獲得データ」と「消費データ」をSUM関数で合計し、処理を行っています。
以上の変更によりウォレット残高を正しく返せるように設定できました
【手法その2】 リンク×ロールアップ
ポイントショップテーブルと獲得ポイントテーブルと消費ポイントテーブルは【手法その1】から変更していません。ウォレットテーブルのルックアップフィールドをロールアップフィールドに変更しただけです。
ロールアップフィールド自体がSUM関数を持ったFormulaのような役割を持っているのでFormulaフィールド「ウォレット残高」では各フィールドの足し引きだけで処理が完了します。
これはあくまでも想像なので正しいかどうかは分かりませんが、ロールアップフィールド/ルックアップフィールドに入力される値の数量が多くなるほどに【手法その1】よりも【手法その2】の方が処理速度が早くなる気がします。(エンジニアの方、どうでしょう??)
また、ユーザー情報テーブルにリンク&ルックアップでウォレット残高を表示させてみました
まとめ
1. リンクフィールドはあくまでもテーブルどうしを関連付ける機能でしかない。リンクレコードとして表示されている値はただの"飾り"程度に考えた方が良い。
2. フォーミュラで実際に値を処理する場合にはルックアップ/ロールアップしたデータをテーブルに表示させる必要がある。
ここまで読んで頂きまして有り難うございました。またAirtableについて詳しい情報を教えて頂いたNoCodeCampのメンバーの方々に感謝です。
Twitterをやっておりますのでフォロー宜しくお願い致します
▶︎ https://twitter.com/NoCoderT