基本情報のファイル編成は、レコードをどのように配置するかと、目的のレコードへどうたどり着くかを分けると理解しやすくなります。順編成は先頭から順に処理する形、索引順編成は索引から場所を探す形、直接編成はキーから格納先を求める形、区分編成はディレクトリからメンバを選ぶ形です。
名前だけを覚えるより、同じ商品台帳をどの方式で扱うのかを考えてみましょう。全件の月次集計と、指定した商品一つの照会では、望ましいアクセスの仕方が違います。この記事では学習用の小さな台帳と自作問題で、方式の選び分けまで整理します。
- レコードの配置とアクセスの順序を分けて考える
- 四つの編成を同じ商品台帳の例で比較する
- 索引のあふれ域とハッシュ衝突を区別する
- 業務の要件から適切な方式を選ぶ
基本情報のファイル編成を配置とアクセスで理解する

レコード・ファイル・キーを商品台帳で確認する
まず、商品コード、商品名、在庫数の三項目を一組にしたものを一つのレコードとします。そのレコードを集めたものが商品台帳ファイルです。商品コードは、目的の商品を指定するキーとして使います。ここでは商品コードが重複しない台帳を仮定します。
| 商品コード | 商品名 | 在庫数 |
|---|---|---|
| 110 | ノート | 20 |
| 120 | 定規 | 15 |
| 140 | ペン | 30 |
| 170 | 付箋 | 12 |
「在庫数を全部足す」なら四つのレコードを読む必要があります。一方、「コード140の在庫だけ確認する」なら、目的のレコードへ早く届くことが大切です。保存する項目が同じでも、どんな仕事を繰り返すかによって、使いやすい配置とアクセスは変わります。
ファイル編成が対象にするのは、このようなレコードの組織化です。写真を画像フォルダに入れる、拡張子を変える、ファイル名を並べ替える、といった普段の操作とは粒度が違います。データベースのインデックスやOSのディレクトリと似た言葉も出ますが、設問がどの単位を扱っているかを先に確認してください。
レコードと、装置が一度に読み書きするブロックも区別します。商品一件が一レコードでも、複数件を一ブロックへまとめることがあります。このまとめ方がブロッキングです。論理的に四件を読んだことから、物理的な読込みが必ず四回と断定することはできません。
例えば一ブロックに二件を入れるという学習用の仮定なら、110・120で一ブロック、140・170で一ブロックになります。レコードがどの順で返るかという編成の問題と、一回の入出力で何件を運べるかという問題を分けてください。電子情報通信学会の「ファイル管理」では、レコード・ブロッキング・ファイルのアクセスをそれぞれ説明しています。
編成は配置のルール、アクセスは取り出し方
順次アクセスは、ある位置から次のレコードへと順に進む方法です。直接アクセス、またはランダムアクセスは、対象のキーや位置を指定して必要なレコードを取り出す方法です。ランダムという名前でも、でたらめなデータを返すという意味ではありません。読みたい順序を指定できるということです。
動的アクセスは、順次と直接を必要に応じて切り替える使い方です。例えばコード140の位置を指定し、その後は170へ順に進む処理が考えられます。「動的編成」という第五の配置を覚えるのではなく、アクセスのモードを切り替える言葉として整理すると混乱を防げます。
製品ごとの名称や対応範囲は同じではありません。IBMのデータ編成とアクセス・モードの説明でも、順次・索引付き・相対の各編成とアクセスモードを分けています。この記事の四方式は基本概念の比較であり、すべての製品を同じ名前で分類する表ではありません。
順編成は先頭から連続して処理する

順編成では、レコードを連続した順序で並べて扱います。台帳を110、120、140、170の順で記録したなら、先頭から読むとその順に受け取ります。コード140を探すために順次読み込みをする場合、110、120を通ってから140へ着きます。
全件を一度ずつ集計する処理には、順に読み進める方法が自然です。前のレコードを読んだ後に次を読むという単純な流れになり、索引をたどる必要もありません。毎月すべての商品を集計する例では、先頭から最後まで読むこと自体は無駄ではありません。必要な仕事の一部だからです。
ただし、順編成なら必ず商品コードの昇順になるわけではありません。入力された順序とキー順が一致するかは、作成方法によります。キー順の併合や突き合わせをする場合は、その順序に整っているかを確認します。「順番に保存する」と「特定の項目で整列済み」を同じ意味にしないことが大切です。
途中へ新しいレコードを挿入し、従来の並びを維持する処理には手間がかかります。例えばコード130を120と140の間へ入れるなら、新旧ファイルを読み書きして作り直す方法が考えられます。末尾への追記と、途中への挿入は別の操作なので、「追加は常に簡単」「更新は絶対に不可能」と一括りにしないでください。
索引順編成は索引とデータを組み合わせる

索引順編成は、キー順のデータと、目的の場所を探す索引を組み合わせる考え方です。本の索引から該当ページを開くように、まずキーを手掛かりにデータの位置を絞ります。そこから目的のレコードを取り出すことも、後続を順に読むこともできます。
学習用に、110・120を第一のまとまり、140・170を第二のまとまりとします。索引が各まとまりのキー範囲と位置を管理していれば、140を探すときは第二のまとまりへ進めます。実製品の索引が必ずこの二段構造という意味ではなく、「索引を経由してデータへ届く」という役割を表した例です。
昔から説明に使われる索引順編成のモデルでは、基本データ域へ入らない追加レコードをあふれ域で管理します。追加が続いてあふれ域へたどる処理が増えると、効率が落ちる場合があり、再編成で配置を整理します。索引があることは、更新しても常に同じ効率を保てるという保証ではありません。
一方、現代の索引ファイルがすべて同じあふれ域方式を採用するわけではありません。設問が古典的な索引順編成の領域構造を示しているなら、そのモデルで解きます。データベースのB木などへ詳しく進む前に、まず索引域、基本データ域、あふれ域がそれぞれ何を持つのかを区別しましょう。
直接編成はキーから格納先を求める

直接編成では、キーを基に格納位置を決め、その位置へアクセスします。キーをそのまま位置の手掛かりにする考え方もあれば、関数で変換する考え方もあります。とくにハッシュを使う場合は、キー値から格納先の候補を計算できる点が特徴です。
例えば学習用の関数を「商品コードを7で割った余り」とします。110の余りは5、120は1、140は0、170は2です。格納先を0〜6の箱で表せば、それぞれ対応する箱へ向かえます。この数字は説明用の仮定で、実際の商品管理に使うハッシュ関数の推奨ではありません。
ここへコード147を追加すると、147も7で割った余りが0になり、140と格納先候補が重なります。異なるキーから同じ格納先が求まる現象が衝突で、試験ではシノニムという言葉も使われます。キーが異なることと、変換後の値が異なることは同じではありません。
衝突したからといって、元の140の在庫を147の在庫で上書きしてよいわけではありません。別の空き位置を探す、同じ箱につながる構造で持つなど、衝突を解決する仕組みが必要です。仕組みによって追加の探索が生じるため、「直接編成ならキーの偏りに関係なく必ず同じ時間」という断定は避けます。
区分編成はディレクトリからメンバを選ぶ
区分編成では、一つのまとまりの中へ複数のメンバを保存し、ディレクトリでそれぞれの名前や位置を管理します。各メンバの中身は順編成として扱う構造です。まずメンバを見つけ、その中のレコードを順に扱う、という二段階で考えてください。
例えば帳票を作るプログラムと、在庫を点検するプログラムを、それぞれ別のメンバとしてライブラリへ収めます。ディレクトリから必要なプログラムのメンバを選び、その内容を読み込みます。商品一件ごとの位置を求める直接編成と違い、最初に選ぶ対象がメンバである点が判別の手掛かりです。
IBMのデータセットの種類の説明では、区分データセットをディレクトリとメンバで構成する方式として案内しています。普段のフォルダに似て見えても、OS上のあらゆるフォルダがこの方式そのものという意味ではありません。問題文の構造と処理単位を見て判断しましょう。
基本情報のファイル編成を例題と要件で選び分ける

四方式を比較するときは処理の単位を見る
| 編成 | 場所を決める手掛かり | 得意な使い方の例 | 注意する点 |
|---|---|---|---|
| 順編成 | レコードの並び | 全件を順に集計 | 途中挿入や並べ替えの手間 |
| 索引順編成 | キーと索引 | キー指定と後続の順次処理 | 索引の管理やあふれ域 |
| 直接編成 | キーから求めた格納先 | 指定キーの照会・更新 | 衝突や空き領域 |
| 区分編成 | メンバ名とディレクトリ | 複数プログラムのライブラリ | メンバ内の処理と区別 |
この表の使い方は、最も速そうな方式を丸暗記することではありません。「何を指定しているか」「何件を処理するか」「順序を使うか」という三つを問題文へ当てはめます。一つの商品を指定する話と、プログラムのメンバを指定する話は、どちらも場所へ直接進むように見えても、対象と構造が違います。
索引を持つと検索を絞れる反面、保存領域や更新時の管理も必要です。全件を必ず読む仕事では、索引があるだけで読む件数が減るとは限りません。また、直接編成の空き領域が多いと記録効率に影響することもあります。アクセス時間だけを見て、領域や更新の条件を落とさないようにしましょう。
例題1は月次集計と単品照会を分ける

次は学習用の自作問題です。商品台帳に一万件のレコードがあり、月末にすべての在庫数を合計します。途中の特定商品だけを抜き出す処理は行わず、ファイルの先頭から全件を一度ずつ読むものとします。この処理の特徴に合う基本的な考え方は何でしょうか。
答えは順編成による順次処理です。合計を求めるために全件を読むので、全レコードへ続けて進めれば目的を果たせます。ただし、この条件から「実際のどのシステムでも順編成が絶対に最速」とまでは言えません。装置、バッファ、レコード長、実装による差を固定していないからです。ここでは処理の性質と編成の対応を答えています。
条件を変えて、日中は商品コードを指定した単品照会を何度も行うとします。この場合は全件を毎回先頭から読む必要のない、索引やキーから格納先を求める方式が検討対象になります。月末処理だけを見た結論を、そのまま別の業務へ流用しないことが選び分けの基本です。
例題2はハッシュの衝突を手計算する
自作問題として、格納先を「キーを10で割った余り」で決めるファイルを考えます。キーは21、32、41、54です。21は1、32は2、41は1、54は4へ向かいます。したがって21と41が同じ格納先候補になり、衝突します。
ここで「21と41は異なるキーだから衝突しない」と考えると誤りです。比較するべきなのは、元のキーそのものではなく、関数を適用した結果です。手を動かす際はキー、計算式、余りの三列を作り、同じ結果になった行を探すと確認しやすくなります。
また、この例でキー32と54に衝突がないことは、ファイル全体で今後も衝突しない証明にはなりません。キー42を追加すれば32と同じ2になります。将来の追加や偏りを考慮する必要があるため、平均的な効率がよいことを、最悪時の一定時間保証へ読み替えないようにしてください。
例題3は索引を引いた後の読み方を考える

次の自作問題では、商品コード順に管理する台帳から、まずコード140以上の最初のレコードを見つけ、その後は170、180、190とキー順に読み進めます。最初に位置を指定し、続けて順次処理するという条件です。索引付きの編成と、直接・順次を切り替える動的アクセスの組合せを考えられます。
「140以上のすべて」を求めているなら、140そのものが必ず存在するとは限りません。150が最初になる場合もあります。設問で完全一致検索なのか、範囲の始点を探すのかを確認し、その後の継続処理を読みます。具体的な命令や開始位置の指定方法は処理系によるので、問題で示された条件を優先してください。
索引順編成の説明に「順」という語があっても、アクセスが順次だけとは限りません。反対に、直接アクセスを一度行ったからといって、編成名が必ず直接編成になるわけでもありません。編成名を答える設問か、アクセスモードを答える設問かを最後まで確認すると、よく似た選択肢を切り分けられます。
よくある誤解を三つの確認で直す

一つ目は、順編成を磁気テープ専用だと思うことです。順次しかアクセスできない媒体では順に読む方式が自然ですが、直接アクセス可能な装置へ順編成ファイルを置くこともできます。装置ができることと、ファイルの配置・プログラムのアクセス方法は、同じ階層の話ではありません。
二つ目は、あふれ域とハッシュ衝突を同じ現象だと思うことです。あふれ域は追加レコードなどの格納場所として登場する領域、衝突は異なるキーが同じ格納先候補へ変換される現象です。仕組みによって関連することはあっても、「領域」と「計算結果が重なる現象」を区別すれば、説明の主語を見失わずに読めます。
三つ目は、VSAMを単純に「主記憶へファイルを置く方式」と覚えることです。VSAMは複数のデータセット構成を扱うアクセス方式であり、名前の仮想記憶だけから保存先や高速化の理由を断定しません。ESDS、KSDS、RRDSなどの対応が問われたら、入力順・キー順・相対番号という識別の違いを、提示された構造と合わせて確認しましょう。
製品固有のVSAMの構成は、IBMのVSAM編成の説明で確認できます。基本情報の学習では、まず四方式を区別し、その後に必要な製品用語を対応付ける順序で十分です。古い方式名が出ても、現在の一般的なOSやDBがすべてその構造で動くと一般化しないことが大切です。
関連する知識とつないで復習する
データベースの検索でも索引という言葉が出ますが、この記事はファイル編成の比較に絞っています。検索を速くする役割や更新コストを別の角度から学ぶなら、基本情報のインデックスと複合索引の解説がつながります。同じ用語でも、どの構造を前提にしているかを意識して読んでください。
ファイル編成の変更と利用者のデータの見え方を分けて考えると、基本情報の3層スキーマとデータ独立性も理解しやすくなります。また、物理的な入出力の時間を求める設問は、ディスクアクセス時間の計算へ進むと、配置の話と装置性能の話を区別できます。
まとめとして基本情報のファイル編成を二軸で確認する
基本情報のファイル編成は、配置とアクセスの二軸で確認しましょう。先頭からレコードを続けて読むのが順編成の基本、索引からデータの位置へ進むのが索引順編成、キーから格納先を求めるのが直接編成、ディレクトリからメンバを選ぶのが区分編成です。
問題を解くときは、指定する対象がレコードかメンバか、全件か一部か、順序を保つ必要があるかを先に抜き出します。その後で、索引の管理、衝突、追加による配置の変化などを検討してください。方式名の印象で選ぶより、業務が必要とする読み方を一文にする方が、選択肢の違いを説明しやすくなります。


コメント