こんにちは!今回は、データベースの長い歴史の中でも特にシンプルで力強いアクセス方式、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など)」のありがたみが驚くほどスッと理解できるようになりますよ。
一歩ずつ、一緒にマスターしていきましょう!
コメント