【入門編】 HSAM (Hierarchical Sequential Access Method) – 階層型DBMS

こんにちは!今回は、データベースの長い歴史の中でも特にシンプルで力強いアクセス方式、HSAM(Hierarchical Sequential Access Method:階層順次アクセス手法) についてお話しします。

「階層型DBMSって、RDB(リレーショナルデータベース)より難しそう……」と思うかもしれませんが、心配いりません。仕組みは驚くほど素直で、物理的なデータの並び方を理解するのに最高の教材なんです。

ここをクリアすれば、階層型DBMSの基本データ構造はバッチリマスターできますよ。肩の力を抜いて、一緒に見ていきましょう!

—

1. HSAMを日常のモノに例えると?

HSAMを一言で表すなら、「昔ながらのカセットテープ」 や 「絵巻物」 です。

音楽配信サービスなら、聴きたい曲をタップすれば一瞬でジャンプして再生できますよね(これがランダムアクセス)。
しかし、カセットテープはどうでしょう? 3曲目を聴くには、1曲目と2曲目を「早送り」して順番に通過する必要があります。巻き戻しも同様です。

[1曲目: A] ===> [2曲目: B] ===> [3曲目: C] ===> [4曲目: D]
※ 順番にしか進めないけれど、最初から最後まで通して聴くなら最高にシンプル!

HSAMもまったく同じです。
データを「前から順番に、隙間なくギッシリ並べる」という究極にシンプルな記録方式をとっています。かつて磁気テープ(テープ装置)が主役だった時代に大活躍した構造ですが、その設計思想には「データの連続読み込みを極限まで速くする」という美しい合理性があります。

—

2. 親子関係のデータを「一本のテープ」に並べる魔法

階層型データベースの特徴は、「親・子・孫」のようなツリー状(木構造)のデータを持つことです。
では、枝分かれしたツリーデータを、どうやってカセットテープのような「一本の直線」に並べるのでしょうか?

身近な「会社と社員」の例で見てみましょう。

【ツリー構造のイメージ】

[営業部] (親)
/ \
[社員: 田中] [社員: 鈴木] (子)
|
[家族: 花子] (孫)

HSAMは、この木構造を「上から下へ、左から右へ」というお決まりの順番(専門用語で先行順走査といいます)で、1本の長いデータ列として記録します。

【テープ上の物理的な並び順】

—————————————————————
[営業部] –> [社員: 田中] –> [家族: 花子] –> [社員: 鈴木]
—————————————————————
(親) (子1) (孫) (子2)

1. まず親である 「営業部」 を書く
2. 次に左側の子 「田中」 を書く
3. 田中の下にある孫 「花子」 を書く
4. 田中の枝が終わったので、右側の子 「鈴木」 を書く

このように、ポインタ(次の場所を指す矢印のデータ)を使わずに、物理的に隣同士にデータを敷き詰めるのがHSAMの最大の特徴です。無駄なデータが一切なく、ファイルサイズを極限までコンパクトにできます。

—

3. スキーマ定義(DBD)を覗いてみよう!

階層型DBMS(代表例:IBM IMS)では、データベースの構造を DBD (Data Base Description) という定義言語で記述します。

「難しそう……」と身構えなくて大丈夫です。HSAMの定義は驚くほどシンプルですよ。

  • HSAMデータベース定義(DBD)のサンプル

  • 1. データベースの名前と、アクセス手法(HSAM)を宣言します

DBD NAME=CORPDB,ACCESS=HSAM

  • 2. 最上位の親セグメント(部署)を定義します

SEGM NAME=DEPT,BYTES=50
FIELD NAME=(DEPTNO,SEQ,U),BYTES=4,START=1

  • 3. 部署にぶら下がる子セグメント(社員)を定義します
  • PARENT=DEPT で「誰の子供か」を指定しています

SEGM NAME=EMP,PARENT=DEPT,BYTES=80
FIELD NAME=(EMPNO,SEQ,U),BYTES=6,START=1

  • 4. 社員にぶら下がる孫セグメント(家族)を定義します

SEGM NAME=FAMILY,PARENT=EMP,BYTES=40
FIELD NAME=(FAMNAME,SEQ,U),BYTES=20,START=1

  • 5. 定義の終了

DBDGEN
FINISH
END

先輩のワンポイント解説

`ACCESS=HSAM` と書くだけで、システムは「余計なアドレス情報は持たず、レコードを順番通りに物理配置すればいいんだな」と理解します。余計な管理情報(ポインタ)がないため、DDLも非常にスッキリしていますね。

—

4. HSAMの「得意」と「苦手」

このシンプルな仕組みのおかげで、HSAMには明確な得意分野と苦手分野があります。

| 操作 | 得意? 苦手? | 理由 |
| :— | :—: | :— |
| 頭から全件読み込む (バッチ処理) | 超得意! | テープを一方向にダーッと流し読みするだけなので超高速。 |
| データの保管 (アーカイブ) | 超得意! | ポインタを持たないため容量効率が100%に近く、テープ保管に最適。 |
| 途中のデータを変更・削除する | 超苦手… | テープの途中に新しいデータを割り込ませたり、消したりすることは物理的にできません。 |
| ピンポイント検索 (ランダムアクセス) | 超苦手… | 目的のデータが末尾にある場合、先頭からすべて読み飛ばす必要があります。 |

途中のデータを更新したいときはどうするの?

カセットテープの途中の1曲だけを別の曲に差し替えるのが難しいのと同じで、HSAMは「その場での更新(インプレース更新)」ができません。

もしデータを更新したいときは、「古いテープを読み込みながら、変更箇所を直した『新しいテープ』をもう1本まるごと作る」 という豪快な方法(バッチ更新処理)をとります。

[古いHSAMデータ] ──(読み込み)──┐
├──> [更新プログラム] ──> [新しいHSAMデータ作成]
[変更指示データ] ──(読み込み)──┘

一見手間に見えますが、「過去の履歴を改ざんせず、丸ごと世代バックアップを取る」という意味では、金融機関の確定処理などで非常に堅牢なアプローチとして重宝されてきました。

—

まとめ:仕組みを知ればデータベースはもっと面白い!

HSAMのポイントを振り返ってみましょう。

1. カセットテープのように「先頭から順番にギッシリ並べる」構造
2. ポインタを使わず、階層ツリーを一本の直線に敷き詰める
3. 部分更新は苦手だが、全件バッチ読み込みやバックアップには圧倒的に強い

現代のデータベースはランダムアクセスが当たり前になりましたが、ログの書き込み(WALなど)やビッグデータの順次処理など、「順番に並べて一気に読む・書く」というHSAMの設計思想は今も形を変えて生き続けています。

基本のキであるHSAMを押さえれば、次回以降に登場する「ポインタを使ってランダムアクセスを可能にした方式(HISAMやHDAMなど)」のありがたみが驚くほどスッと理解できるようになりますよ。

一歩ずつ、一緒にマスターしていきましょう!

コメント

タイトルとURLをコピーしました