ファイルによるデータ管理
業務システム開発手法の「ユニケージ」では、データベース管理システムやフレームワークなどを使わずにシステムを構築します。システムの中身が見えやすい分、仕組みやルールを理解していないと正しい開発ができません。第1回はユニケージの特徴の一つである、ファイルによるデータ管理を紹介します。
業務システムの開発手法である「ユニケージ」では、システムの開発においてデータおよびその管理が最も重要と考えています。
一般的なシステム開発では、テーブルなどは定義するものの、データの保存・操作・管理をリレーショナルデータベース管理システム(RDBMS)というソフトウエアに任せています。そして、データの操作や管理には、問い合わせ言語の「SQL」を使用しています。
一方、ユニケージでは、データの保存にテキストファイルを利用します。入力されたデータはほぼそのままの状態で保管し、最新のデータを抽出できるような工夫が加えられています。データの操作や管理には、UNIX系OSやLinuxに備わっている標準のコマンドおよび、基本的なデータ操作のための独自コマンド(usp Tukubai)を使います。
データベースエンジニアにとって、ユニケージにおけるデータの扱い方や操作・管理方法は特殊に見えます。しかし、ユニケージのやり方は、一般的な業務処理や業務システムに対して多くの利点があります。
ユニケージの開発元であるユニバーサル・シェル・プログラミング研究所では、データベースエンジニアやシステムエンジニア、または企業のシステム管理者がユニケージ開発について学べるようにさまざまな教育を用意しています。まずは教育講座「速習・SQLからの移行編」を基に、SQLによるデータ操作がユニケージではどのように実現されているのかを数回に分けて解説します。第1回は、ユニケージのファイル管理です。
ユニケージとは
ファイル管理を紹介する前に、ユニケージの特徴をまとめておきます。ユニケージは、UNIX系OSやLinuxなどのOSの基本機能を使いこなして、企業システムを構築する手法です。主なプログラムをシェルスクリプトで開発し、データの保存や管理にはテキストファイルを用います。テキストファイルで管理するといってもデータの永続性を保証する「CRUD」(Create Read Update Delete)はユニークな方法で実現しています。
RDBMSやフレームワークを使う一般的なシステムに比べて、ユニケージで開発したシステムは次のような利点があります。
(1)データ管理の仕組みが簡単なため、参照中心のシステムなどではデータ処理の高速化が期待できる。
(2)スクリプトとして処理速度がネックになる部分には独自コマンドを用意し、データを逐次処理しているため、業務処理に対する高速化が期待できる。
(3)システムすべてをテキストベースのファイルで開発しているため、プログラムのデバッグだけでなく、データ自体のデバッグがやりやすい。また、スクリプトによりすぐに修正や確認ができる。
(4)RDBMSやフレームワークに頼らないため、型にはまらない、思い切ったシステム設計やパフォーマンス改善ができる。
(5)業務という単位で処理を単一のスクリプトにまとめているため、構造が分かりやすく動作も調べやすい。
ただし、ユニケージでシステムを開発する場合に他の開発手法に比べて、次の点が重要です。
(1)データの配置やレイアウト、ワークフローなどでシステムの性能や設計難易度が変わるため、データを扱う深い知識が必要である。
(2)データをストリーム(流れ)で逐次処理するような設計に慣れておく必要がある。
(3)データに対する排他制御などの仕組みは、自身で用意しなくてはいけないのでシステム設計に対するさまざまな知識が必要である。
(4)不用意なバグの発生を防いだり、高度なパフォーマンス改善を実施したりするには、OSやハードウエアの知識が不可欠である。
シェルスクリプトとテキストファイルでシステムを開発できるといった、誰でも始めやすいユニケージですが、ユニケージ流のやり方を身に付けないと失敗します。
RDBMSとユニケージのデータ管理・処理の違い
通常、RDBMSではデータベース内のテーブルでデータを保存・管理し、標準化された問い合わせ言語のSQLを使ってアクセスして更新や検索などのデータ処理を実施します(図1)。一方、前述したようにユニケージでは、テキストファイルにデータを保存し、シェルスクリプトを使ってデータを処理します(図2)。表1に示したように、ユニケージにはSQLの各文や句に相当するコマンドがいくつか用意されています。
なお、ユニケージでは、データベースの管理するプログラムに相当するものがありません。「ulock」コマンドなどを用意していますが、基本的にはUNIX/Linuxのファイル管理機能を利用して排他制御などのデータ管理を実現しています。
データベースの排他制御は、RDBMSにとっても重たい処理です。ユニケージではファイルに対する排他制御を使わずにデータの更新処理を実現しています。これについては、本連載で少しずつ触れています。



データ保存のファイル形式
ユニケージでは、次の3種類の形式でデータをテキストファイルに保存しています。
(1)フィールド形式 … フィールド(列)に分けてデータを保存する(図3)
(2)タグ形式 … 1行目にデータの項目名が並び、2行目以降にデータをフィールドごとに分けて保存する(図4)
(3)ネーム形式 … 1列目に項目名が並び、2列目以降にデータを分けて保存する(図5)

実際のシステムでは(1)のフィールド形式でデータを保存することが多いといえます。ただし、本連載ではRDBMSとの比較が分かりやすいように、(2)のタグ形式を扱います。
前述したように、タグ形式は1行目にデータの項目名が並びます。2行目以降が実際のデータです。項目ごとのデータは、一つの半角スペースで区切られています。項目名やレコード(行)の長さに制限はありません。
シェルスクリプトやファイルの特性上、「int」や「date」といったデータ型は存在しません。「1.23」のような浮動小数点や、「2022/10/25」のような日付も単なる文字列として扱われます。型はないですが、ユニケージでは文字列を数字や日付として演算するための独自コマンドを用意しています。
データ更新処理
ユニケージでは、基本的に図6のようなコマンドでテキストファイルを加工してデータの更新を実現します。入力ファイルとしてデータを保存したテキストファイルを渡し、コマンドで加工後にその結果を別のテキストファイルに出力します。この出力ファイルから更新後のデータが取得できるわけです。

このような処理を実施する場合にいくつかの注意点があります。まず、入力ファイルのサイズが100Gバイトあれば、加工後の出力ファイルも同じサイズになる可能性があります。データを絞り込んで処理しない限り、それだけの領域を確保しなくてはいけません。また、データ加工時にはストレージからのファイルの読み込みと書き込みが発生します。そのため、ファイルI/Oがボトルネックなって期待していた性能が出ないことが考えられます。
よって、RDBMSよりもデータを保存するテキストファイルには工夫が求められます。例えば、商品マスターであれば、キーとなる「商品コード」(CODE)と各項目(NAME、PRICE、VENDOR、ATTR1、ATTR2、ATTR3)を横に並べた1ファイルよりも、キーと項目を1対ずつセットにしたファイル群の方が一つのファイルサイズを小さくできます(図7)。ちなみに、このようにキーバリュー形式のデータファイルを、ユニケージでは「分割マスター」と呼んでいます。

このように、ユニケージでは一つのレコードに多くの項目を持つよりも不要な項目を削り、区分別にファイルを用意するなどの工夫が必要です。ファイルの数は増えても、ファイル内の項目数を減らすことで効率に処理できるといった特徴があります。
ファイルにはマスターとトランザクションがある
RDBMSでは、データベース内のテーブルにデータを保存しています。基本的にほとんどのテーブルはマスターとして扱われます。ユニケージでは、入力ファイルか、出力ファイルか、マスターとして保存するファイルか、一時ファイルかなどの利用目的の違いを常に意識しなくてはいけません。特に、「マスター」と「トランザクション」という名前で性質の違うファイルを分けています。
マスターと呼ばれるファイルは、前述の分割マスターのように各レコードが行頭のキーとなるユニーク(唯一無二)なコードによって識別できます。その後に項目ごとの値(バリュー)が並びます(図8)。このマスターの特徴は次のようになります。
・キーが昇順に整列されている
・キーがユニークである
・キーがレコードの一番左側に配置する

一方、トランザクションと呼ばれるファイルは、随時発生する情報(データ)をレコード単位にまとめたものです(図9)。例えば、次のような特徴があります。
・レコードを識別する明確なキーが存在しない
・時間の経過とともに随時レコードが増えたり減ったりする
・マスターにひも付くキーを左側に配置する
・項目ごとの値を右側に配置する
・キーはユニークとは限らない

今後の連載でマスターやトランザクションが登場しますが、そのときまでにこれらの特徴を捉えておいてください。
次回は、ファイルおよびデータ処理に必要となるコマンドと、実際にRDBMSからテーブルを取り出してユニケージで処理する例を紹介します。
著者:田渕 智也、高橋 未来哉
※本記事は、シェルスクリプトマガジン Vol.81(2022年12月号)に掲載した記事からの転載です。