アプリの「親子関係」を理解しよう! 前編

フォローする
(著者:サイボウズ 佐藤 紅志)

はじめに

 
さまざまな場面で用途の幅が広がっている kintone ですが、この記事では実際の業務への適用にあたり、ご相談をいただくことの多い、アプリ間のいわゆる「親子関係」についての考察を行いたいと思います。実装上のTipsというよりは、複数のアプリが必要となる業務において、各アプリ間の関係性を設計する際の考え方として、皆様の一助になれば幸いです。
 
さて「親子関係」というと、集合論理や家庭問題(!)など何やら面倒で複雑なイメージを持たれる方もいらっしゃるかもしれませんが、あまり固く考えずに、kintone 上で実装可能な以下2通りの関係をこの記事での「親子関係」として取り扱いさせていただきます。
 

1.同居親子関係

kintone では「テーブルフィールド」を用いることにより、あるアプリの中に、関連する複数の情報を保存することが可能です。この時「テーブルフィールド」として設定された項目を「子」それ以外の項目を「親」と呼び、この2つの情報の関係性を「同居親子関係」※と呼ぶこととします。
 
 

2.独立親子関係

kintone の「ルックアップフィールド」を用いて、あるアプリから別のアプリを参照したい場合、参照される方を「親アプリ」参照する方を「子アプリ」と呼び、この2つのアプリの関係性を「独立親子関係」※と呼ぶこととします。
 
※これらの呼び方は、あくまでも情報の親子関係性の説明の為に、便宜的にこの記事のみで使用しているもので、正式な呼び方ではございませんので、悪しからずご了承くださいませ。
 

親子関係について

 
上記の「親子関係」において、いずれも、1つの「親」に対して複数の「子」が存在することが可能です。
 
  • 1.の「同居親子関係」の場合
    • 「親」の無い「子」は存在しません。
    • 「親」が消去されると「子」も消去されます。
    • 「親」の「子」が同時に他の「親」の「子」となることはできません。
 
  • 2.の「独立親子関係」の場合
    • 「親」の無い「子」は原則として存在可能です。
    • 「子」の「親」へのルックアップフィールドが必須項目の場合は、その制約が有効な限り「親」の無い「子」の登録はできませんが、存在は可能です。
    • 「親」の消去が「子」の消去を、必ずしも意味しません。
    • 「親」の「子」が同時に他の「親」の「子」となることも可能です。(必要な「親」の数のルックアップフィールドがいります。)
 
こうしてみると、当然の事ながら親子の関係性がより強いのが「同居親子関係」であり、逆に独立志向の強い「子」を持つ「親」との関係が「独立親子関係」であるというのがイメージできるかと思います。
 

商品見積書パックの例

 
「同居親子関係」及び「独立親子関係」双方を実装している例として、アプリストアにある[商品見積書パック]がございますので、これを元に具体的なそれぞれの作用を見ていきましょう。
 
 

商品見積書パック内の同居親子関係について

このアプリでは「親」である「見積書」に「同居親子関係」の実装としてテーブルフィールドを利用し「見積明細」が実装されています。「見積書」のない「見積明細」は存在し得ないので、この関係性は妥当に見えます。正に同居している状態です。
 
kintone の実装上の機能として、テーブルフィールドに設定された数値項目は計算フィールドの計算対象となりますので、この場合であれば、その計算式に、[sum(小計)]とするだけで「子」の情報である「小計」項目の集計を行った「合計金額」として実装されています。
 
「合計金額」は「子」の情報を集計したものですが、kintone ではこの計算結果としての項目も「親」の情報として一覧に表示を行うことができます。また、「子」の情報として登録してある、明細内容の確認も一行づつではありますが[表示する]リンクを選択することにより、可能となっています。
 
これまでシステム開発経験のある方ほど「同居親子関係」にある「子」については、中に篭もっている情報であるとのイメージを持たれる(実際に篭っているのですが)ため、「子」情報の合計値や明細を一覧で確認するのは難しいと考えられるようで、よく問合せをいただくところですが、これらを標準で実現可能なところが、kintone の強力な機能のひとつと言えるかと思います。
 
 
また、一覧で表示するのみならず、「子」の情報である見積明細の商品情報と、小計金額情報を元に、商品別売上構成をグラフに表示するなどの集計も簡単に行うことができます。以下は2016年1月版より提供されたモバイルビューでのグラフ表示を行っているスマートフォン画面になります。
 
 

商品見積書パック内の独立親子関係について

次に「独立親子関係」の特性を見てみましょう。見積明細はこれまで述べてまいりましたように、見積に対しては「同居親子関係」を持っていますが、商品リストアプリに対しては「独立親子関係」を持つという、少々複雑な環境に育った子供のようです。まずはその個性と言いますか、独立している様子を見てみたいと思います。
 
kintone における「独立親子関係」は、構成するアプリケーションが異なる、というのが「同居親子関係」との最大の違いになり、実際の設定にあたっては前述の通り「ルックアップフィールド」の仕組みを利用します。
 
見積書アプリの例ですと、明細行に定義された「型番」が、商品リストアプリにやはり「型番」として定義されており、明細行に設定された「型番」と商品リストに一致する「型番」について、その商品リストが所有するフィールド「商品名」と「価格」の値が、それぞれ明細行の「商品名」「単価」にコピーされるように設定されています。
 
 
明細行で、コピーされること自体は便利なものの、そのフィールドは、kintone によって入力不可項目になりますので「この商品なんだけど、この時だけは値引きの金額にしたい」などの要件には対応できず、独立関係という意味では今ひとつな気もしますが、独立であっても親子であることには変わりませんので、ここは kintone はこういう仕様ということでご理解頂ければと思います。
 
一般に、こうした関係性を構築する「親」「子」の関連を構成する「型番」に該当する項目は、キー情報として「親」においては重複不可として定義される必要がある事が多く、例の商品リストアプリにおいてもそのように定義されてはおりますが、kintone は選択肢を提示するダイアログが表示される事により、重複可の項目であっても有効な関連を構成することが可能です。
 
また、余談ではありますが、値引きなどの調整金額を設定したい場合、商品リスト側に「値引き」という商品を登録しても単価は固定されてしまいますので、実際に機能させるには困難が伴います。そのような場合は「調整金額」などの数値フィールドを「親」の情報として、テーブルフィールドとは別に設定を行い、合計金額の計算を「sum(小計) - 調整金額」などとしましょう。
 
話を元に戻しまして「同居」関係の場合「親」の消去は「子」の消去を意味しましたが「親」である商品リストアプリと「子」である見積書アプリ内の見積明細が、独立関係である場合はどうなるか見てみましょう。下記画面は、一度明細に登録した商品を見積書アプリのレコード登録後に、商品リストアプリから消去した後に参照している画面になります。
 
 
少々画面は端折っておりますが、ご覧のように、既に削除された商品であってもその商品名と単価は見積明細に保持されております。つまり「親」が消去されても「子」の情報は残っています。データの一元管理という観点からは、議論を呼ぶ振る舞いかもしれませんが、見積明細作成時点の情報が保存、保持されているという意味では、この kintone の実装は、その振る舞いを理解して頂くことを前提に非常にリーズナブルなものなっています。
 
ちなみに「親」の変更であっても同様の振る舞いになりますので、商品リストの商品名や単価を変更したとしても「子」の見積明細には反映されませんので、その点では十分留意した設計が必要となります。まさに独立した「子」としての振る舞いであることをイメージしていただければと思います。
 

続編について

 
さて、本記事も少々長くなって参りましたので、続きは「その2」として本記事では取り扱いきれなかった
  • 「関連レコード一覧」について
  • 「同居親子関係」の制約事項
  • 見積書アプリで「同居親子関係」にある見積明細情報を「独立親子関係」に変更した場合の作用
  • 「独立親子関係」に対応したスクリプト例
について記載させ頂きたいと思います。

 

記事に関するフィードバック

直接的に記事と関連がないご質問はcybozu developer コミュニティをご活用ください。

ログインしてコメントを残してください。
Powered by Zendesk