汎用コンピュータにおけるファイル

# データ保存の考え方
データをどのような形式で保存するかは、各アプリケーションにお任せだった。
ファイルは```レコードの集合という考え方もない```。
しかし汎用コンピュータが```レコード単位```でプログラムや業務データを入力していたことから
OSがレコード管理機能を持つようになった。
OSがどのようにレコードを格納するかを定義づけた、```ファイル編成法をいくつか用意```している。
```それをプログラムに提供している。```

## 気づき
どのような形式でデータを保存するかは決まっていなかったんだな。
そうする前までどのようにデータの保存があったのだろうか？
今ではプログラムに提供している。とはOS側がデータの管理をしていることか。
定義する前までは応用ソフトウェアが何かやっていたのか？
ちょっとわからなくなった。
これから勉強していこう。

# ファイルへのアクセス方法
ファイル編成法の種類を見る前に
ファイルに対しての読み書きを行う際のアクセス法について紹介する。

## 順次アクセス（シーケンシャルアクセス)
```先頭レコードから順番```にアクセスする方法。
上から順々にアクセスする

## 直接アクセス（ランダムアクセス）
```任意のレコードに直接```アクセスする方法。
順番関係な任意のレコードを取り出す。

## 動的アクセス
```任意のレコードに直接アクセス```した後、それ以降を```順次アクセスで順番```に処理する。
直接アクセスと順次アクセスの組み合わせ。
取り出してそれ以降も取り出す。

# ファイル編成法の種類
## 順編成ファイル
```先頭から順番```にレコードを記録していく編成法。
順次アクセスのみが可能。
* ```一連のデータを大量```に処理する。
* レコードの```挿入や削除は苦手```

## 直接編成ファイル
任意のレコードに直接アクセスを可能とする編成法。
キー値から格納アドレスを求める方法が異なる
```直接アドレス方式```と```関節アドレス方式```がある。

### 直接アドレス方式
```キー値の内容をそのまま```格納アドレスとして用いる方式。
キー値の内容が```飛び飛びの場合使用されない領域がたくさんできてしまう```。
例 キー値が０１の場合格納アドレスが同じ01になる。

### 相対編成ファイル
最初のブロックからの相対番号で直接アクセスを行うもの

#### ブロックとは？
* ブロック化
複数のレコードを一定数ごとにまとめること。1レコード単位で読み書きしていると時間がかかるため、ブロック化してまとめて処理することで効率を上げる。ブロッキングとも呼ぶ。
出典 https://kotobank.jp/word/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E5%8C%96-8519
* ブロック
ブロックは、テープ上にあるデータの物理的な単位です。ブロックには、レコード、レコードの一部、または複数のレコードが含まれます。
出典　https://www.ibm.com/docs/ja/i/7.2?topic=concepts-records-blocks-formats
### 間接アドレス方式
```ハッシュ関数（計算式)を使ってキー値から格納アドレスを算出```して用いる方式。
ハッシュ関数による計算で計算結果が同じになりレコード同士が衝突する。
これを```シノニム```という。
また衝突が起きたレコードを```シノニムレコード```という。
衝突が起きると別の場所に格納しなければならないので```別の式で再計算しなければならない```
```シノニムが多発するとアクセス速度が落ちる```ことになる。

### 気づき 
#### なぜシノニムが多発するとアクセス速度が落ちるのか?(未解決）
思ったことが書いてなかった。
そんな中調べている間に気になることが書いてあった。
複数のDBからデータを収集する必要のある場合…
最近ではよくある話ですが、こういった要件での常套手段がDBリンクです。

DBリンクを使う場合のメリットは、
シノニムを利用することでリンク先のテーブルを自己スキーマ内の
テーブルと同じように扱えることにあります。
出典 https://insource-mkd.co.jp/staff-blog/7351.html

シノニムを利用するとはなんなんだろう？
シノニムはハッシュ関数による計算で計算結果が同じになりレコード同士が衝突を意味していないのか？
シノニムを調べてみた。
#### シノニム(synonym)
ITの分野では、```一つの実体に複数の識別名などが割り当てられる機能```や、そのように設定された```別名```などを指すことが多い。
```データベースのシノニム```
データベース管理システム（DBMS）などで、テーブルやビューなどに```本来の識別名とは異なる任意の文字列を別名として与える```機能が提供されている場合がある。複数の利用者でシステムを操作する場合に、ログインしているユーザーの違いやオブジェクトの所有者の違いによらず同じ表記で対象を指定できるようになる。

```データ型のシノニム```
プログラミング言語では、```データ型に既存の名称とは別の名前を与えることができ、これを型シノニム```（type synonym）などという。DBMSでも標準規格との互換性などのために型シノニムが定義されている場合がある。

```検索システムのシノニム```
自然言語を対象とした検索システムでは、```同義語や表記の揺れなど、検索時に同じ単語として認識すべき語群を一つのグループとして扱う機能```があり、これをシノニムという。

```ハッシュ探索のシノニム```
ハッシュ探索（ハッシュ法）や直接編成ファイルなどで、複数のキー値（ハッシュ値）が同じアドレスを指してしまい、```複数のデータが同一アドレスに衝突してしまう現象```をシノニムという。複数のデータを連結して識別できるようにする工夫が必要となる。
出典 https://e-words.jp/w/%E3%82%B7%E3%83%8E%E3%83%8B%E3%83%A0.html#:~:text=%E3%82%B7%E3%83%8E%E3%83%8B%E3%83%A0%E3%81%A8%E3%81%AF%E3%80%81%E5%90%8C%E7%BE%A9%E8%AA%9E,%E3%82%92%E6%8C%87%E3%81%99%E3%81%93%E3%81%A8%E3%81%8C%E5%A4%9A%E3%81%84%E3%80%82

「あだ名」とか「別名」のこと
出典 https://wa3.i-3-i.info/word1216.html

良いハッシュ関数は、次の特性を持っています。

よく散らばったハッシュ値を返すこと
高速に実行できること
散らばるというのは、異なるデータならば異なるハッシュ値になってほしいということです。散らばりが悪いハッシュ関数を使うと、衝突が頻繁に起こってしまいます。チェイン法では、連結リストが長く伸びていく結果になりますから、性能悪化を招きます。
出典 https://programming-place.net/ppp/contents/algorithm/search/006.html

別の割り当てられる名前の方がシノニムは使われやすいのか？
いろんなシノニムの使われ方があるんだな。

# 索引編成ファイル
索引を格納する```索引域```、
レコードを格納する```基本データ域```、
溢れたレコードを格納する```あふれ域```がある。
索引による```直接アクセス```と先頭からの順次アクセスという両方の特性を備えている。
レコードの追加などで基本データ域に入りきれないレコードがあふれ域に入る。

## 気づき
索引を使い直接アクセスを行うのか。
これで順次アクセスもしやすくなるのか。
データを削除するときはどうなるのかな。
丸ごと消すのかな。
### データを削除するのか？
索引ファイルがレコードの追加、削除、変更などにより更新されると、索引構造とデータ構造がばらばらになるため、```処理効率が悪く```なります。さらに、```削除されたレコードに残された領域は常に再使用されるわけではない```ため、```ファイルが必要以上に大きく```なってしまいます。
多くの変更を行った場合、```索引ファイルを再編成```して、データと索引を順序正しくリビルドし、```空き領域を再利用できる```ようにすると便利です。この作業により、```最適なパフォーマンスとデータの整合性が保証```されます。
ファイルを再編成する利点は他にもあります。たとえば、ファイルを順編成処理する場合、ファイルを処理するためのアクセス時間は時間が経つにつれて増えます。これは、レコードが更新され、順序が変更されるためです。このような場合に```ファイルを再編成すると、アクセス時間を短縮```できます。
.
.
.
一部のキーをすでに削除した場合でも、重複値の最大回数に到達する可能性があります。このような状況では、ファイルを再編成することが得策です。
出典 https://www.microfocus.co.jp/manuals/ED60/VS2017/BKFHFHREBUU015.html

一つでも削除すると再編成することがいいのか。

# 区分編成ファイル
```メンバ```と呼ばれる準編成ファイルを複数持つ。
それらを格納する```メンバ域```.
各メンバへのアドレスを管理する```ディレクトリ域```で構成される。
主にプログラムやライブラリを保存する用途に使われる。

* 各メンバへのアドレスを管理して、直接アクセスする。
* メンバを丸ごと```追加・削除するのは柔軟```に行える。
* レコード単位だと```順編成ファイルなので苦手```
* 順編成ファイルなので```順次アクセス可能```

## 気づき
ディレクトリ域に複数のメンバがあってメンバの中はメンバ域という領域があり、その中に順編成ファイルがあるのか。
ディレクトリ域の```アドレスを基にメンバを探す```。
ディレクトリ域　> メンバ > メンバ域　> 順編成ファイル
主にプログラムやライブラリを保存する用途に使われる。とはどのように使われているのか？

### 区分編成ファイルとプログラムとライブラリの関係(未解決）
一つのファイルを、複数のメンバという順編成ファイルに区分し、メンバのアドレスを管理するメンバディレクトリ（登録簿域）で構成したファイルです。
　 　一般に、汎用コンピュータでは、```個々のソースプログラムをメンバとして持ち、それらのプログラム群をまとめてプログラムライブラリ```として、一つの区分編成ファイルにします。
　 　パソコンでは、メンバという概念はありません。パソコンのディレクトリやフォルダはＯＳが管理しています。それに対して、```区分編成ファイルは、個々の物理的なファイルのなかで管理```しているのです。
出典 http://www.kogures.com/hitoshi/webtext/hs-file-hensei/index.html

どうしてプログラムとライブらの保存に使われるのかわからなかった。

# 問題を解いた時の気づき
## バッファとは？
入力されたデータや出力するデータを一時的に記憶しておくための記憶領域。
主記憶上に作られることが多い。
入った分は読めるということか。

## 直接アクセス記憶装置では使えない。
順次アクセスをすることができなくて順次編成ファイルから直接アクセスできないわけじゃないのかな。

### 直接アクセス記憶装置とは？
記憶装置のうち、データを任意の場所に保存したり、任意の場所から読み出したりできるもののこと。
出典 https://kotobank.jp/word/%E7%9B%B4%E6%8E%A5%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E8%A8%98%E6%86%B6%E8%A3%85%E7%BD%AE-5812