前回の記事では、業務アプリをノーコードツールを使って作るかどうかに関わらず、「そのアプリで使うデータの構造」、「データ操作画面をどんなものにするのか」、「どんな機能が必要か」ということをあらかじめ考えておかなければならないことを説明しました。
今回は、前回 AppSheet を使って作成することにした診療記録アプリで使うデータの構造を考えます。そしてそのデータを格納するデータベースとして Google スプレッドシートを利用することにします。(これは Excel のような表計算ソフトで、Google のアカウントを持っている人なら誰でも使うことができます。)
この診療記録アプリは、ある架空のクリニックで使う非常にシンプルなもので、日々の一つ一つの診療に対して、日付、患者名、症状・状態、処置、備考、担当スタッフを記録していきます。そしてそれらの診療の情報の登録、閲覧、修正、削除、検索などが行えるようにします。
目次
Google スプレッドシートについて
Google スプレッドシートはオンラインで使う表計算ソフトです。つまり、表計算ソフト自体はインターネット上の Google のサーバー上に置かれていて、わたしたちはパソコンのウェブブラウザを使ってそのサーバーへアクセスして使うようにできています。(これに対し多くの人が使っている Excel はパソコン自体に導入されています。ただし、Excel オンラインと言うものもあります。)
ですから、Google スプレッドシートを使うためには、まず、スプレッドシートが置かれている Google のサーバーへアクセスします。いくつかの URL からアクセスすることができますが、例えば、Google スプレッドシート:オンラインスプレッドシート からアクセスすることができます。スプレッドシートへアクセスし、ログインボタンをクリックすると、自分の Google アカウントを選択してログインするように求められます。自分のアカウントを選び、パスワードを入力すると、Google スプレッドシートのトップ画面が開きます。ここで、「新しいスプレッドシートを作成」から「空白のスプレッドシート」をクリックするとExcel に似ている画面が現れ、「無題のスプレッドシート」というタイトルがついたスプレッドシートシートが作られます。Excel とは細かい所で色々違っていることもありますが、AppSheet でつくる業務アプリのデーターベースとしてこのスプレッドシートを利用する場合、ごく基本的な操作、主にセルへの入力操作しか使わないため、Excel との違いを意識する必要は特にないでしょう。
ちなみに、Excel で「ブック」、「ワークシートまたはシート」と呼ばれているものは Google スプレッドシートではそれぞれ「スプレッドシート」、「シート」と呼ぶようです。
診療記録アプリで使うデータの構造
それではスプレッドシートを使って、データベースとなるものを作ってみることにします。
スプレッドシートのタイトルは「無題のスプレッドシート」のままにしておかずに「診療記録」などとしておくのが良いでしょう。
一つ一つの診療に対して、日付、患者名、症状・状態、処置、備考、対応スタッフを記録することにしたのですから、とりあえず次のようなものを考える人が多いかもしれません。(必ずしも必要とは言えませんが、ここではそれぞれの「診療」に対して固有の番号となる id をつけています。)
この一枚のシートだけでも必要な情報をすべて記録することができますが、実はいくつかの問題があります。
例えば、患者名の列には「佐藤健一」が2つあります。(2行目と5行目)ではここで、実は漢字での表記に誤りがあり「健一」ではなく「憲一」が正しいということがあとからわかったとします。そうすると、2行目と5行目の両方を修正する必要があります。つまり、このような作業では、ある一人の名前のデータを修正するだけにも関わらず、複数の行のデータを修正することになります。そのため、修正すべき行がたくさんあるほど、いくつかの行をうっかり修正し忘れるということが発生しやすくなるという問題を抱えています。
この問題を解決するためには、次のように、このシートとは別に患者を記録するシートを作り、患者名のデータを分離するということをします。
このシート「患者」では、各患者はもちろん一回しか現れないようにしておきます。また、それぞれの患者に固有の id をつけました。
シート「診療」では「患者名」をそのまま列として用意するのではなく、次のように「患者id」という列を用意しました。(必ずそうしなければならないというわけではありません。)
そして、シート「診療」に現れる各患者はシート「患者」に現れる患者から選ばれるようにする仕組み(参照する仕組み)を何らかの方法で用意します。つまり、シート「診療」の「患者 id」がシート「患者」の「id」を参照することにより、それぞれの診療における患者名が分かる仕組みを用意するわけです。そのような仕組みを用意しておけば、シート「患者」に現れる患者の名前を修正するだけで、シート「診療」に現れる患者の名前も自動的に連動して修正されるようになります。そのような仕組みは、スプレッドシート自体に備わっている機能を用いて実現することもできますが、ここではその必要はありません。AppSheet に備わっている機能を使うことにより業務アプリの作成と同時に実現することができます。
ここでは、シート「診療」の患者名を修正するときに起きる恐れのあるミスを防ぐという観点から新たにシート「患者」を作りました。しかし、一般にデータベースで扱うデータの構造を考える場合、シートを作る前に実体-関連モデル(ER モデル)と呼ばれるものを考えるということがよく行われます。実体-関連モデルでは、普通、患者は初めから実体として登場し、そこから必然的にシート「患者」が作られることになります。実体-関連モデル(ER モデル)については次の記事を参考にしてください。
ところで、この他にもまだ問題点があります。それらの問題点を解決しようとすると実は上に提示した2枚のシートでも不可能で、例えば次のような4枚のシートを作ることで対処することができます。
前に説明したように、患者データを分離して新たなシートを作っています。
スタッフデータを分離して新たなシートを作っています。シート「診療」の「患者 id」 がシート「患者」の「id」を参照するように想定しているのと同様に、後にシート「診療」の列「スタッフ」を削除しますが、次に紹介するシート「診療-スタッフの組」を通じてシート「スタッフ」の「id」を参照することを想定しています。
このシートも、実体-関連モデル(ERモデル)からデーターベースの構造を考え始める場合は最初から必然的に存在することになります。
各診療とその診療に対応したスタッフのid を組にしたデータを格納するシートを新たに作りました。シート「診療」でそれぞれの診療につけられた id がこのシートの「診療 id」を参照することにより、それぞれの診療で対応したスタッフが見つかるように想定しています。ところで、初めにとりあえず考えたシート「診療」では、列「スタッフ」に複数のスタッフ名を記述することが許されていました。実は、ある列の値として複数の値を記述できるシートを用いると、リレーショナルデータベースの考えに基づいた業務アプリソフトでは何らかの困難を抱える原因になることがあります。複数の値を許している列をシートから取り除くために別の新しいシートを作る作業はリレーショナルデータベースの第1正規化と呼ばれています。
実は、AppSheetでは列に対して List 型や EnumList 型のような、複数の値を保持する型を指定することができるので、非正規リレーションを取り扱うことができます。
もともとのシート「診療」にあった列「スタッフ」は削除されています。その結果、複数の値を持つことが許されていた列はなくなりました。それぞれの診療に対応した「スタッフ」は、先程のシート「診療-スタッフ」についての説明にあったように、それぞれの診療につけられている id を通してシート「診療-スタッフ」の「診療 id」を参照することにより見つけられるようにするわけです。
以上見てきたように、ある業務で取り扱うデータの構造を考えるとき、必要に応じてシートから列を分離して新しいシートを追加し、新しく追加されたシートの列及びもとからあったシートの列の対応付けを行い、データベースとしてより適切な構造をもったものへ改善していく作業を行います。この作業はリレーショナルデーターベースの正規化としてよく知られているものです。
リレーショナルデーターベースやその正規化については次の2つの記事で基本を解説しているので参考にしてください。
まとめ
今回もコードを全く書くことなく作業を進めることができました。
しかし、取り扱うデータの構造を考える際、データベースに関する基礎知識、例えばリレーショナルデータベースやその正規化についての知識が必要になることが分かります。
次回は AppSheet にスプレッドシートのデータを連携し、AppSheet でデータ構造を設定することを行います。