データベースとストレージはどちらもデータを入れるものだけど、何が違うのか

はじめに

こんにちは。divxエンジニアの龍満です。

今回のタイトルは、私の頭に浮かんだ疑問です。

データベースとストレージはどちらも業務で使用しています。

でも改めて両者を比較した時に、違いをうまく説明できないことに気づいたのです。

両者の違いは、説明するまでもない基礎の部分なのかもしれません。

でも意外と私と同じように、なんとなく使っているエンジニアもいるのではないでしょうか。

ということで今回は、「レイヤー」という言葉をキーに、初学者がデータベースとストレージの違いや両者の関係を、具体的に頭の中に描けるように掘り下げていきます。

新人エンジニアを教える立場にある方にも、役立つ記事になれば幸いです。

前提知識

データベースとストレージを比較するにあたり、それぞれの言葉の意味を確認しておきましょう。

データベース

データが使いやすく整理された状態になっている集まりのことです。概念的な言葉なので、広い意味では紙媒体で物理的に管理するもの(ファイリングされた書類など)も含みますが、多くの場合コンピューター上で管理するものを指します。

またデータベースという言葉が出てきた時に、具体的なMySQLなどのソフトウェアを指しているケースがあります。というより、そのケースが大多数です。この場合のデータベースは、正確にはDBMSのことを指します。本記事で取り扱うデータベースも、これ以降DBMSを意味します。

DBMS(DataBase Management System)

その名の通り、データベースを管理するアプリケーションソフトウェアです。データベースの作成、データの追加・編集・削除などを効率的に行えるようにします。具体的にはMySQL、PostgreSQL、Oracle Database、Amazon Aurora、DynamoDBなどが挙げられます。(DynamoDBはNoSQL、それ以外はRDBMSとなります。)

アプリケーションソフトウェア

アプリケーションソフトウェアとは、コンピューターにインストールして動く、特定の目的のために動くプログラムのことです。比較対象としてOS(オペレーションシステム)が挙げられますが、こちらはコンピューター自体を動かすソフトウェアになります。

ストレージ

「補助記憶装置」と呼ばれる、パソコンやスマホの中にある物理的な「装置」のひとつです。具体的には、USBメモリ、ハードディスク、CD、DVDなどが挙げられます。類似の言葉で「主記憶装置」がありますが、こちらはメモリを指します。

ストレージやメモリの他、キーボード、ディスプレイなどコンピューターを物理的に構成する部品をまとめてハードウェアと呼びます。

データベースとストレージはレイヤーが違う

データベースとストレージ、何が違うの?の問いに対する答えのひとつは「レイヤーの違い」です。レイヤーって何?レイヤーが違うとなんなの?という疑問を、順番に説明します。

「レイヤー」って何?

「レイヤー」とは「層」を意味する単語で、階層構造になっている仕組みを例える場面で使われます。単語を使われる場面によって意味は異なりますが、今回参考にする「レイヤー」とは、OSI参照モデルでの各層のことを指します。具体的には、下記の図で表されます。

OSI参照モデルとは、コンピューターがネットワーク上で通信する際の約束事を定め、階層構造に役割を分けたものです。このOSI参照モデルに、データベースとストレージの関係をなぞらえてみましょう。

OSI参照モデルはあくまで通信の約束事なので、データベースはこの層、ストレージはこの層という言い方は厳密には適切ではありません。ですが当てはめてみることで両者の関係性が理解しやすくなりますので、それぞれが関係する通信、と捉えていただければと思います。

データベースのレイヤー

データベースはアプリケーションソフトウェアです。アプリケーションソフトウェアが関係するレイヤーは、L7(アプリケーション層)です。

ストレージのレイヤー

ストレージはハードウェアです。ハードウェアが関係するレイヤーは、L1(物理層)です。


レイヤーが違うってどういうこと?

このように、データベースとストレージはレイヤーが異なります。それが何なんだ、と思うかもししれませんが、大切なことは上のレイヤーの土台には下のレイヤーがあるということと、上のレイヤーは下のレイヤーを意識しなくても目的を果たせるということです。

この二点について、具体例をあげながら見てみましょう。

上のレイヤーの土台には下のレイヤーがある

たとえば顔を洗うために水を出そうと思った時、その裏には水道管が通っていることが前提になっています。水道管だけでなく、そもそも水がどこかで確保されている必要があります。

たとえば私たちが電車でどこかへ行けるのは、電車そのものや電車を動かす仕組みがあって成り立っています。電車だけでなく、そもそも線路が敷かれていなければ電車を走らせることはできません。

これと同じように、アプリケーション層の土台には物理層があるのです。そもそもスマホ本体がなければスマホアプリを使うことはできないですよね。同様に、データベースの土台にはストレージがあるのです。

上のレイヤーは下のレイヤーを意識しなくても目的を果たせる

私たちが水を出すという目的のために取る手段は、蛇口をひねることです。目的地に着くための手段は、電車に乗ることです。水道管が破裂していないか、もしくは線路がつながっているかを気にするのは別のレイヤーの仕事です。
同様に、データベースを使うときに、その都度ストレージのことを意識する必要はありません。ストレージが物理的に壊れていないことを保証するのは、ストレージレイヤーの仕事なのです。

レイヤーが違うと役割も違う

レイヤーが違うということを別の視点から見ると、役割が違うとも言えます。どういうことか、データベースとストレージの役割を書店に例えながら見てみましょう。

それぞれの役割と保存対象

データベースの役割は、後からデータを参照・編集・削除しやすくするために、データを整理して保存しておくことです。書店に例えると、本がジャンル別や五十音順に並べてある本棚です。

データベースが保存するのは、後から参照・編集・削除したいデータです。本棚の中の本や雑誌にあたります。

一方ストレージの役割は、保管場所を提供することです。こちらは書店で例えると店舗そのものです。

ストレージは単なる保管場所なので、何でも保存します。本を含む本棚、カウンター、レジなど、多岐にわたります。

このように両者の役割は違い、役割が違うということは保存する対象にも違いがあるのです。

データベース自体がストレージに保存されている

パソコンの場合、コンピューターに直接ダウンロードした写真や書類などの他、コンピューター内で使用するアプリケーションソフトウェアや、OSもストレージに保存されています。

本棚自体が書店に置いてあるように、データベース自体がストレージに保存されているのです。

参考までに、Macのストレージの中身を見てみましょう。

画面左上のりんごマーク→「このMacについて」→「ストレージ」タブを選択すると、下記のようにストレージの中身が確認できます。

色別にカーソルを当てると「App」「書類」「macOS」「システムデータ」などが確認できます。

データベースはこの「システムデータ」に該当します。(Macのバージョンや種類によって表示は異なる場合があります)

具体的に見てみよう

では本当にデータベース自体がストレージに保存されているのか、実際にMySQLをMacにインストールして確認してみましょう。

実行環境

MacBookAir(M1, 2020)

MySQLのインストール

インストール方法は色々ありますが、今回はHomebrewを使ってインストールします。
Homebrewが入っている状態で、ターミナルで下記コマンドを打つことでインストールできます。

brew install mysql@バージョン名

インストール後、保存されている場所をMacのファイル管理アプリケーションであるFinderで確認してみましょう。
Homebrewでインストールしたものは、 下記ディレクトリに保存されます。
(Macのバージョンによって異なる場合があります)

/opt/homebrew/var/

ハードディスクはデフォルトでは非表示なので、Finderを開いている状態で画面上部の「移動」→「コンピュータ」を選択すると、「Macintosh HD」が表示できるようになります。

また「opt」フォルダは隠しファイルでこちらも最初は非表示なので、Finderを開いた状態で command + shift + . キーを同時に押すことで表示できます。

まず、MySQLのインストール前がこちら。

MySQLをインストール後

確かに、ストレージ(Macintosh HD)内にデータベースがインストールされていることが確認できました。

Homebrew

Mac OS上でソフトウェアのパッケージ(実行ファイルや設定ファイル、ライブラリなどのまとまり)を簡単に管理できるシステムです。インストール、アンインストール、バージョン変更などを容易に行えるのがメリットです。

データの保存

ではデータベース内にデータを追加してましょう。

まずはターミナルでMySQLを起動し、以下のコマンドを実行してMySQLにログインします。

mysql.server start

下記コマンドでデータベース一覧を確認できます。

mysql> SHOW databases;

まだ何もデータベースを作っていない状態がこちら。

データベースを作成します。

mysql> CREATE DATABASE testdb; // testdbがデータベース名

先ほどのコマンドで、新しいデータベースが作成されていることを確認します。

対象のデータベースを選択後、下記コマンドでテーブルを作成しましょう。

mysql> USE testdb;  //対象のデータベースを選択
mysql> CREATE TABLE users (id INT AUTO_INCREMENT, name TEXT, PRIMARY KEY (id));

INT:型の指定、AUTO_INCREMENT :データタイプの指定、PRIMARY KEY (id):プライマリーキーをidカラムに設定

下記コマンドで新しいテーブルが作成されていることを確認します。

mysql> SHOW tables;

下記コマンドでテーブルのカラムも確認できます。

mysql> DESCRIBE users;


では作成したテーブルにデータを入れてみましょう。

mysql> INSERT INTO users(name) VALUES ('テストユーザー');

下記コマンドでレコードが作成されていることを確認できます。

mysql> SELECT * FROM users;

保存場所の確認

ではデータの作成までできましたので、このデータがストレージに保存されているかを確認してみましょう。

確かにストレージ内のmysql内の中にtest.dbディレクトリ、その中にusersテーブルが作成されています。

参考(MySQLを直接ダウンロードした場合)

MySQLを直接ダウンロードした場合は下記ディレクトリにインストールされます。

/usr/local/

インストール前

インストール後

どのインストール方法でも、ストレージ内にデータベース自体が保存されていることが確認できました。

終わりに

今回は初学者向けに、データベースとストレージの違いや両者の関係について見てきました。

・データベースとストレージは、レイヤーが違う

・レイヤーが違うということは、役割や保存対象も違う

・データベース自体がストレージに保存されている

切り口によってはまた別の比較の仕方もあると思いますので、これだけが正解という訳ではありません。

それでも今回のようにレイヤーに分けるという考え方は、エンジニアとして仕事をする中でおおいに役立つと思いますので、何かの参考になれば嬉しいです。

最後までお付き合いいただき、ありがとうございました。

divxでは一緒に働ける仲間を募集しています。
興味があるかたはぜひ採用ページを御覧ください。
divx.co.jp

参考資料

基礎からわかる TCP/IP ネットワークコンピューティング入門(書籍)
MySQL Documentation