プログラミング学習ログ

WEBアプリケーション個人開発を目指す32歳公務員

#6 データベースについて学んだこと

f:id:kshinya-tech:20220209192704p:plain 読書ログサービスの登録データを保存できるようにデータベースと接続します。

その前にデータベースについて学習した内容をアウトプットします。

データベースについて

データベースの必要性

  • データベースがないとプログラムを終了するとデータが消えてしまう。
  • 「ファイルに保存する」という方法もあるが、ファイル保存の場合、ファイルへの保存、ファイルからの読み取りのプログラムをいちいち書かなければならず、面倒。

データをファイルで管理するのには限界がある

データをファイル管理する場合、以下の3つの弊害がある。

例えば、複数の部署でファイル管理を行なっていたとすると、

  1. データが重複してしまう可能性がある。(データの重複)

  2. データの内容が部署によって異なる可能性がある。(データの矛盾)

  3. Excelの1つのファイルに大量のデータを保存していた場合、フリーズする可能性がある。

そこで登場するのがデータベース

データベースとは、データの基地。

データを一箇所に集めて、いつでもすぐに利用できるようにしたもの。

上記の例では、データベースに複数の部署からアクセスできるようにする。

データベースの特徴

  • 大量データの検索・登録・修正・削除を素早く簡単にできる
  • 同時に複数の人が利用してもデータに矛盾が生じない(同時実行制御 / 排他制御)
  • データが飛ばないように対策できる(耐障害性)
  • データが流出しない(セキュリティ)

    → 大人数で、大量のデータを、安全に管理できる

データベースの種類

データを保持する形式に応じて5種類に分類される。

  1. 階層型データベース
  2. リレーショナルデータベース(今回はこれを使用していく!)
  3. オブジェクト指向データベース
  4. XMLデータベース
  5. NoSQLデータベース

リレーショナルデータベースが最も利用されており、NoSQLデータベースも利用されている。

あとはニッチな形式のデータベース。

リレーショナルデータベースについて

リレーショナルとは?

リレーショナルとは、数学で「集合」を表す言葉。

一般的には二次元表のことで、データを二次元表を使って管理するデータベースがリレーショナルデータベース。

リレーショナルデータベースのすごいところ

ファイルだと...

  • データを操作するのにプログラミング言語で処理を書かないといけない
  • プログラムを実行するための環境も必要

    → プロのエンジニア以外がデータを操作しにくい

二次元表だと...

  • プログラミング言語を使えなくてもデータを操作できる
    • 明快な演算でデータを抽出できる
    • リレーショナルデータベースの言語であるSQLのおかげ

  → 幅広いユーザーが使うことができる

リレーショナルデータベースには複数の製品がある

抽象概念である「データベース」を実装したものがリレーショナルデータベース。 代表的なものは以下。

  • MySQL
  • Oracle Database
  • PostgreSQL
  • Microsoft SQL Server

MySQLとは

MySQLはオープンソースのリレーショナルデータベース

  • オープンソースなので誰もが無料で利用可能
  • 処理が高速で、信頼性があり、使いやすい
  • 世界中の多くの企業によって利用されている

DockerでMySQLに接続する方法

Dockerではappコンテナ(PHP)とdbコンテナ(MySQL) が定義されていて、appコンテナからdbコンテナに接続する。

docker-compose exec app mysql -h db -u book_log -D book_log -p
# パスワードを入力
  • クライアント(データベースを利用するプログラムやターミナル)からmysqlサーバに接続する
    • -h : host。ホスト名
    • -u : user。ユーザ名
    • -D : database。データベース名
    • -p : password。値を指定せずに実行すること。ターミナルがパスワードの入力を求め、入力時に表示されないため、セキュア。
  • ホスト名は「docker-compose.yml」、それ以外は「docker/db/db-variables.env」で設定する。

MySQLとの接続を切断する方法

quit
# exitでも可

読書ログテーブルの作成

MySQL [book_log]> CREATE TABLE reviews (
    ->   id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->   name VARCHAR(255),
    ->   author VARCHAR(30),
    ->   status VARCHAR(30),
    ->   score INTEGER,
    ->   summary VARCHAR(500),
    ->   created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
    -> ) DEFAULT CHARACTER SET = utf8mb4;
Query OK, 0 rows affected (0.074 sec)

MySQL [book_log]> SHOW TABLES;
+--------------------+
| Tables_in_book_log |
+--------------------+
| reviews            |
+--------------------+
1 row in set (0.007 sec)

MySQL [book_log]> SHOW COLUMNS FROM reviews;
+------------+--------------+------+-----+-------------------+----------------+
| Field      | Type         | Null | Key | Default           | Extra          |
+------------+--------------+------+-----+-------------------+----------------+
| id         | int(11)      | NO   | PRI | NULL              | auto_increment |
| name       | varchar(255) | YES  |     | NULL              |                |
| author     | varchar(30)  | YES  |     | NULL              |                |
| status     | varchar(30)  | YES  |     | NULL              |                |
| score      | int(11)      | YES  |     | NULL              |                |
| summary    | varchar(500) | YES  |     | NULL              |                |
| created_at | timestamp    | NO   |     | CURRENT_TIMESTAMP |                |
+------------+--------------+------+-----+-------------------+----------------+
7 rows in set (0.008 sec)

参考URL

kitsune.blog