見出し画像

ランダムファイルでデータベース

ディスクという円板状の記憶装置が使われるようになると、テープと異なりトラックとセクタという2次元で管理するデバイスなので、そこに記録されている情報は必ずしも最初から順に読み書きする必要はなく、好きな場所から使えるようになりました。

磁気ディスク

そうなるとファイルという形で管理していた情報へのアクセス方法も進化します。テープ時代と同じような扱いのシーケンシャルファイルに加えて、任意の位置から読み書きできるランダムファイルという仕組みも使えるようになりました。

ランダムアクセス

ランダムと言っても、実際のディスクの構造に近い方法でアクセスしなければパフォーマンスが悪くなります。最初の頃は物理的なセクタをそのまま管理するような方法でアクセスしていましたが、これだとデバイスの構造を反映してしまうので、デバイスが変わればコードも直さなければなりません。そこでレコードと呼ばれる固定長の単位でデータを管理する方法が一般的になりました。

ひとつのレコードは複数の固定長のフィールドと呼ばれる領域の組み合わせからなり、レコードの大きさ(の倍数)がひとつのセクタよりも小さい場合にはパディングされて、レコードの番号から効率よくディスク上のセクタをアクセスすることにより、ランダムアクセスのパフォーマンスを確保していました。

というわけで、それぞれのフィールドの長さは固定されており、ここに名前であるとか電話番号を格納しようとすると、まずフィールドの長さは何バイト必要になるのかが悩みのタネになるわけです。当時はコンピュータで漢字を扱うことが出来なかったので、カナで考えるにしても、まさか寿限無…という名前の人は実際にはいないにしても、16文字で足りるかな?なんて甘く考えていると、外国人の名前が登場して全然足りないじゃないかと気がついたりするわけです。電話番号も当時は携帯電話なんて無かったので、10桁で大丈夫と自信をもって答えてくれる人もいましたが、海外はどうするんだとか、昔は一般的だった内線番号がいれられなくて困るという事態になりました。

このようにして、とにかくデータをディスクにファイルという形に入れることは出来るようになり、これらを活用するプログラムが多く作られるようになりました。データをどの順序で入れるかなんて、プログラムの作り方次第なので、特定のフィールドでソートするようなプログラムが書けることは、プログラムを書く時の入門編というところでした。

さて、古のBASICでは、どのようにランダムファイルを扱っていたのでしょうか。マイクロソフト系BASICでは、OPENでファイルを開きPRITN#で書き込みCLOSEで閉じるのが基本でしたが、ランダムファイルとして使うにはOPENの際に1レコードのサイズを指定するLENオプションを付けて(省略すると256バイト)開きます。この後にFIELDでフィールド長と対応する変数を列挙します。ここで文字列変数が指定された場合は固定長の文字列変数として扱われ、LSETまたはRSETで可変長の文字列から決まったサイズの文字列を設定してPUTで任意のレコード番号に対してデータを書き込んでいくという仕組みになっていました。読み出す時はこの逆でGETにより指定したレコードの内容を読み取り、FIELDで指定したレイアウトで普通の変数とし扱えるようになるのです(文字以外は文字型からの変換が必要でCVI/CVS/CVDなんかが活躍しました)。

他の言語であっても似たりよったりで、FORTRANで言えばFORMAT文、C言語でいればprintfやscanfの書式指定文字列を駆使して、レコードとフィールドとして扱う変数の対応をとっていたんですね。

つまりレコード内の構造はプログラマが管理するのであって、その構造自身はディスク上に書かれているわけではなく、OSは何番目のレコードがディスク上のどの場所にあるかだけを管理しているだけでした。

当然、インデックスファイルが用意されているわけでもなく、複数のプログラムが同時に同じデータファイルへアクセスした場合の保護も自分でやらなければなりませんでした。こうして頑張ってデータベースと言っても良いようなプログラムを作っていたのです。リレーショナルなんてまだ夢のような話でした。

この時代はプログラムを書くといえば、このようなデータを読んだり書いたりするプログラムがとても多くて、ディスク容量を無駄なく使うために、フィールド長を少し節約して溢れたデータを他の使っていないレコードから隙間を借用して書き込んでみたり、自力でインデックスファイルを作るようにしてパフォーマンスをあげたり、この手のノウハウが山のようにありました。腕の見せ所でもあったわけです。

本当は図で示したりサンプルコードを載せたほうが親切なんですが、この辺りで力が尽きました。いずれ具体例で書き直してみます。

#ファイル #ランダムファイル #レコード #フィールド #データベース

この記事が気に入ったらサポートをしてみませんか?