Amazon Honeycode でデータモデリングしてみる

こんにちは、金春です。

前回のブログAmazon Honeycode を触ってみたをたくさんの方に見ていただけたようで、弊社のブログの Google Analytics が大変なことになっていました。

そこで、調子に乗って第二弾ですw

Amazon Honeycode でデータ構造定義してみる

Amazon Honeycode はノーコードでアプリが作れるという点がフォーカスされていますが、その構造上、スプレッドシートでちゃんとデータモデリングすることが大前提になっています。

ですので、この記事ではまずはデータ構造をちゃんと(かどうかはわかりませんが)作るというところをやってみたいと思います。

ただ、まだ完全に理解しているわけではないので、間違っているところがあるかもしれませんが、そこはご愛嬌ということでこっそりツイッターとかで教えてもらえるとありがたいです。

また、ちょいちょいkintoneと弊社のgusuku Customineのことにも触れますが、kintone にも興味持ってくださいねw

前提とするユースケース

よくある、管理のような例で考えていきたいと思います。ER図にするとこんな感じです。(ER図としての正しさは追求していません)

er_orders.png

テーブル名だけが英語になっているのは、執筆時点ではAmazon Honeycode ではテーブル名に日本語が使えないからです。

ちなみに、OrderDetailsに単価があるのは、価格改定があってもその時の単価を残すためにあえて正規化を崩しているわけですが、その目論見はこのあと崩れますw

Customers(顧客)

さて、では Amazon Honeycode で作っていきましょう。まずは、Customers から。

20200630125356_ltivs.png

これは何も考えずに項目並べるだけです。ただ、顧客Noですが、普通に項目追加して「0001」と入れると「1」となって「お前エクセルかよ!」ってツッコミたくなります。ここは素直にPlain Textをちゃんと指定してあげましょう。

で、この項目のタイプの指定なんですが、以下のようにやると列単位で指定できるんですね。

20200630125733_87m0g.png

でも、これ設定して再度開くと、また「Auto」になるときがあるんです。このあたりはベータ版なところですね。改善されることを祈ります。ちなみに、この下にある「COLUMN FORMULA」も華麗に消えることがあるので、がんばって書いた式が消えて「ぎょえ〜!」ってなることがあります。

このテーブルは特にそれ以外に特殊なことはしていませんので、ここまで。

Products(商品)

なんの変哲もないテーブルをもう1つ。商品を定義するテーブルです。ただ項目を並べただけです。

20200630133158_3xjuh.png

Orders(注文)

次に注文管理の本丸とも言える、注文テーブルです。

20200630130208_ssinz.png

これにはいくつか Amazon Honeycode 独自の機能をいれています。

まず、顧客No です。これは、Customersを参照する形にしたいので。Rowlink という Amazon Honeycode 独自の形式にしてあります。Rowlink は要は他のテーブル(やフィルター)の行にリンクするよということです。RDBMSにおけるリレーションをこのような感じで表現することになります。1対多のリレーションにおいて、多の方から1側を選ぶ感じになります。

この指定すると、そのセルはプルダウンのようなマークが表示されて、選択肢から項目を選べるようになります。

20200630130701_bpcfr.png

kintoneで言うところのルックアップみたいなもんですね。

さて、次に一番右の注文明細です。これは、各注文でどの商品が注文されたかのリストになるわけですが、ここはフィルターを使っています。(それが正攻法なのかどうかはわかりません)

20200630130857_7o7ic.png

赤で囲ってある部分がフィルターの式です。要は、「OrderDetailsの中で、注文Noが同じやつを集めろ!」ということをやっています。式の途中に出てくる「%」は、パラメタライズ要素で、その次のパラメータになっている「[注文No]」で % の部分が置換されます。

なんでこんなことになっているかですが、フィルターの式は、条件式なのでダブルクォーテーションで括る必要があります。もし、式の途中で直値指定したい場合、例えば「 Customers[顧客名] = “山田太郎” 」のような式を書きたい場合、実際には「 “Customers[顧客名] = “”山田太郎”””」という式になります。

はい、ダブルクォーテーションだらけで間違いそうですね。

% はこれを回避するためのものと思われます(想像です)。% を使うと「 “Customers[顧客名] = %”, “山田太郎” 」とかけてすっきりします。

話が少し脱線しましたが、フィルターを書くと、1対多の関係において、1側から多を指定することができます。

20200630131532_nna2v.png

漏斗のようなマークのところをクリックすると該当するレコードが表示されます。

これは便利な機能ですね、まるで kintone の関連レコードのようです。

OrderDetails(注文明細)

注文明細行ってみましょう。

20200630131837_a8d9j.png

(使い所がなさそうなのでER図にはいれていた注文明細Noはいれていません)

これはちょっと大変で、通常の値だけを保持している項目は数量だけです。注文Noと商品Noは、上で説明した Rowlink になっています。それぞれ、Orders と Productsの該当レコードを指しています。

小計は、単価*数量の計算式が入っています。これは簡単です。

20200630132054_xtca7.png

Amazon Honeycode では項目名を使って計算式を書くことができますのでエクセルのような「え〜〜〜っとあの項目はB列?C列?」みたいなことはありません。ちなみに「C2*D2」と書くこともできます(が、見た限り下の行に式をコピーしても行番号が増えていかないので正直使いようがありません)

次に単価ですが、これは商品Noを選んだときにProductsから持ってきたいですね。実はこれをどう書けるのかで相当ハマりました。FILTER使うのかな〜とか思ってFILTER書いてもエラー、エラー・・・。

で、もしやと思って超シンプルにこう書いたらできました。「=[商品No][単価]」Amazon Honeycode偉い。

20200630132452_9x769.png

Rowlinkで、他のテーブルの行とのリンクが作成されると、その行のデータには自由にアクセスできます。この行のデータには[商品No]でアクセスできます。ですので、その後に[単価]とつけるだけで、単価を持ってこれます。

ただし、この参照はリアルタイムに行われますので、Products 側で単価を書き換えると、参照している側も一斉に値が変わります。ある瞬間の値をだけをコピーしてきて置いておくってどうやればできるんですかね?

( kintone のルックアップで値をコピーするようなことがしたい。逆にkintoneのルックアップは常にコピーなのでこれはこれで困るわけですが・・・ そういう人はgusuku Customine を使ってください)

ちなみに、Ordersであえて触れなかった注文金額ですが、Filterで取得された複数のレコードも同じ考え方でアクセスできます。それを使ってOrdersの注文金額は、こうしてあります。

20200630132846_5jmfg.png

SUMに渡すだけですべてのレコード分の合計を計算してくれます。これは便利ですね〜。kintone の関連レコードは標準機能では計算できないので、ここは便利です。(でも gusuku Customine 使えば kintone でもできます)

kintone の場合は、Order – OrderDetails 構造だと通常は kintone のテーブル機能で実現することが多いので、実際はこの注文金額はkintone でも問題なく作れます

まとめ

ひととおりデータ構造を定義してみましたが、やはり Rowlink と Filter という Amazon Honeycode の独自仕様を理解することが最初のハードルになりそうです。

また、データ構造の定義という意味では、いわゆる正規化の概念を理解した上でデータ構造を作るというのがやはり重要になりそうです。(実はこれは kintone でも同じです)

次は、いつになるかわかりませんが、このデータ構造をベースにアプリを作るところをやっていきたいと思います。

ちなみに、弊社では kintone をノーコードでカスタマイズするgusuku Customineというサービスをやっていますので、ノーコードに敏感な方はぜひkintoneとgusuku Customineもトライしてみてください。

投稿者プロフィール

アバター画像
金春 利幸
"gusukuシリーズプロダクトマネージャー
ノーコード(No-Code)の有効性に着目し、kintoneとgusukuシリーズの普及のため全国を飛び回っています。"