Databaseの役割
Table of Contents
これは Databaseの実装を学ぶ の記事です
細かい実装に入る前に、まずはDBが実現する目標について整理をまずしてみる。実際に製品や開発において、どのようにDBが利用されるのか?
1. 永続性
DBの大きな役割の第一、永続性。要はパソコンの電源を切っても、データがなくならないようにするってこと。
この機能の実現の為に、DBではレコードと呼ばれる単位で、データをファイルに保存する。イメージとしては、csv
やExcel
の一行がレコードに対応する。
レコード
例えば、出席管理を行うDBを考えてみる。必要そうな項目としては、
- 名前
- 出席しているかのチェック
があれば十分だろう。これをDBに保存すると、
といったテーブル形式で保存される。
この 山田太郎, true
のような各行が、レコード。
実際のDBでは文字列形式ではなく、もっと密度の高い方法で保存を行う。具体的には、バイト配列として格納する。ここら辺の実装は、今後の回で深入りするハズ。
何はともあれ、DBはレコード単位でファイルへの保存を行い、永続化をする。
2. マルチユーザアクセス
さてDBを使う場合は、みんなでデータを使いまわしたい。データをシェアできる必要がある。 複数人でシェアできないと、折角保存したデータが他で利用できない。Youtube
の動画にしろ、X
のポストにしろ、保存されたデータがシェアできないとサービスが作れない!
ということで、マルチユーザのアクセスを実装しないといけない。具体的には、 並行アクセス を実装することになる。並列じゃないよ、並行だよ。つまり、タイムシェアリング的にアクセスできるユーザを、交通整理してあげる形。
3. データの正確な保持
おそらく一般的に、 完全性 と呼ばれるもの。なんかの拍子でDBがクラッシュしたり、PCの電源が落ちてしまったり。そんな時にデータを復旧できるようなシステムが、DBには求められる。
これは、ログによって担保される。DBが本来保持するデータとは別で、DBで実行された操作を記録しておく。これを使って、クラッシュするまでの操作をなぞるようにすれば、ある程度のデータ復旧を行うことができる。
4. 大規模なデータの管理
DBでは、 非常に大規模なデータを扱うことになる。 数GBの小さなものから、数百TBまで。沢山のデータを保持しておく必要がある。しかも、読み書きはなるべく高速に行うのが理想。
ここで重要になってくるのが、 メモリの管理。 アクセスの高速性を実現させるには、 メモリ(RAM)で読み書きを済ませる必要がある。 ここら辺の細かい話は、実装するときに深める。
気になる人は、以下の参考文献が参考になると思う。まぁ、後でブログでも触れるけどね。
5. 可用性
DBは使いやすくないといけない。つまり簡単にデータを、読み書きできる必要がある。ここで出てくるのが、 SQL。 DBに対するクエリ言語で、これでデータを操作できるようにしてあげる必要がある。(SQL自体が簡単かどうかは......? これはこれで奥が深い)
あとは、特定の言語に対するAPIなんかもこれにあたる。要は、アクセスする方法を作って上げないと、他のプログラムにDBの処理を埋め込めないということ。
SimpleDB
さてこれらが、どのように実装されているかを、実装を通してみる。そのために、"Database Design and Implementation - Second Edition"では、SimpleDB
というオリジナルのDBを作成する。
並行アクセスと最低限の読み書きを備えたDBになっていて、教科書内ではJava
で開発されている。まずは、教科書に則りJava
で。できれば、改めて他言語で構築できればいいな。そうすることで、アルゴリズムのコアの部分を我が物にできるはず。
まとめ
今回は本格的な実装に入る前に、DBの要件やこれから実装する内容の整理を行った。
- 永続性 : データを長期間保持する
- マルチユーザアクセス : データアクセスを並行化。交通整理を行う
- データの正確な保持 : トラブルがあっても、データを復旧できる仕組み
- 大規模なデータの管理 : メモリの有効活用で、アクセスの高速化
- 可用性 :
SQL
やAPIを提供し、システムに組み込めるようにする
教科書を通して、SimpleDB
の開発を行い、DBの5つの性質がどのように実装されているのか学んでいく予定。
参考文献
書名 | Database Design and Implementation - Second Edition |
著者 | Edward Sciore |
出版社 | Springer |
リンク | https://link.springer.com/book/10.1007/978-3-030-33836-7 |