さくらのVPSを使ってシステム開発に必要な知識を学ぶ 〜第11回〜

はじめに

本連載は、システム開発に必要な知識を得るために、一通りの流れを学ぶことを目指しています。

本連載の第7回からは、実際の業務を想定したメモアプリを例に、開発の流れを解説しています。今回はバックエンド開発を紹介する予定でしたが、 その前にどんなアプリを製作するかのおさらい(システム構造や機能の解説)と、データベースを操作する言語を解説します。本連載の目的を再確認するためです。

システム構造や機能の解説

システム構造イメージ

今回開発しているメモアプリは、下記の①〜⑥の経路を通って、ユーザーに情報を提供します。

  • ① ブラウザからWebサーバーへリクエストを送信
  • ② WebサーバーからAP サーバーへリクエストを送信
  • ③ APサーバーからDBサーバーへリクエストを送信
  • ④ DBサーバーからAPサーバーへ応答を返す
  • ⑤ APサーバーからWebサーバーへ応答を返す
  • ⑥ Webサーバーからブラウザへ応答を返す

メモアプリの機能は後ほど紹介します。

システム機能の解説

本連載の第7回で作成した、メモアプリの開発計画を再掲します。

データベースアクセスイメージ

上図のように、ブラウザ上に表示されたメモ帳一覧画面やメモ作成・編集画面を使ってデータベース(今回はMySQLを使用します)にアクセスし、データの読み書きを行います。

アプリ画面の概要解説

今回のメモアプリで作成する画面は、メモ帳一覧画面とメモ作成・編集画面の2つです。それぞれの画面について概要を説明します。

メモ帳一覧画面

メモ帳一覧画面の起動時と、各ボタンを押したときの動作を説明します。

  • 起動時:メモ帳の一覧データを取得し画面に表示します
  • 全選択ボタン:表左側のチェックボックスがすべて選択状態になります
  • 選択解除ボタン:表左側のチェックボックスがすべて選択解除状態になります
  • 削除ボタン:表左側のチェックボックスに印が入っているデータを削除します
    • 何も選択されていない時はエラーメッセージを表示します
  • 新規作成ボタン:メモ作成画面へ遷移します
  • 編集ボタン:表左側のチェックボックスに印が入っているデータの編集画面に遷移します
    • 何も選択されていない時はエラーメッセージを表示します

メモ作成・編集画面

メモ作成・編集画面における各ボタンを押したときの動作を説明します。

  • 戻るボタン:メモ帳一覧画面へ遷移します
  • 保存ボタン:画面に入力されたデータを保存します
    • タイトルが入力されていない時は、エラーメッセージを表示します

上記の機能を実装します。

SQLについて

バックエンド開発を始める前にSQLの解説をします。SQLとは「Structured Query Language」の略で、リレーショナルデータベース(RDB)のデータを操作するための言語です。

リレーショナルデータベースとは

リレーショナルデータベース(Relational Database)とは、データをテーブルと呼ばれる二次元の構造で組織し、テーブル間の関連性(リレーションシップ)を利用してデータを管理するデータベースの形式です。このアプローチは、1970年代にエドガー・F・コッドによって提唱された関係モデル(Relational Model)に基づいています。

リレーショナルデータベースの主な概念と特徴は以下の通りです。

  1. テーブル
    • データはテーブルと呼ばれる二次元の表で構造化されます。
    • 各テーブルは列(フィールドまたはカラム)と行(レコードまたはタプル)から構成されます。
  2. 列(カラム)
    • テーブル内の垂直なセクションで、特定のデータ型(整数、文字列、日付など)を持つデータの要素を表します。
    • 列はテーブル内で一意の名前を持ちます。
  3. 行(レコード)
    • テーブル内の水平なセクションで、1つのデータエントリ全体を表します。
    • 行は一意の識別子を持つことが一般的で、この識別子は通常、主キーとして知られています。
  4. 主キー
    • テーブル内の行を一意に識別するための列、または列の組み合わせです。
    • 主キーの値は重複せず、NULL(空の値)も許容されません。
  5. 外部キー
    • 他のテーブルの主キーと関連付けられた列で、異なるテーブル間のリレーションシップを定義します。
    • 外部キーは、データ整合性を維持し、異なるテーブル間でデータを関連付けるために使用されます。
  6. SQL
    • リレーショナルデータベースを操作するための標準的なクエリ言語です。
    • SQLを使用してデータの挿入、更新、削除、検索などを行います。
  7. トランザクション
    • データベースの変更を安全かつ一貫性がある方法で実行するための単位です。
    • トランザクションはACID(Atomicity、Consistency、Isolation、Durability)プロパティを満たすことが期待されます。

リレーショナルデータベースは多くの企業や組織で広く採用されています。データの整合性や構造化されたクエリ言語による柔軟なデータ操作が可能なため、データ管理の効率性を高めるのに役立ちます。代表的なリレーショナルデータベース管理システム(RDBMS)には、MySQL、PostgreSQL、SQLite、Microsoft SQL Server、Oracle Databaseなどがあります。

今回は理解に重点を置いているため、上記1〜4, 6と単一テーブルで解説します。

今回解説するデータベース操作

本記事では、SQLを用いて行うデータベース操作のうち代表的なものを、SQL文や操作例を交えて紹介していきます。具体的には以下の操作を説明します。

  • テーブルの作成
  • テーブル内のデータ検索
  • テーブルへのレコード挿入
  • レコードの更新
  • レコードの削除
  • テーブルの削除

MySQLにログイン

はじめにMySQLにログインします。

$ sudo mysql

ターミナルのプロンプトが$からmysql>に変わったら、MySQLコマンドモードになります。

テーブルの作成

テーブル作成を行うSQL文はCREATE TABLEです。文法は以下の通りです。

CREATE TABLE ユーザー名 (列名1 データ型1, 列名2 データ型2, 列名3 データ型3, ...);

SQLコマンドの実行例を以下に示します。

mysql> CREATE TABLE MEMOS (ID INT AUTO_INCREMENT PRIMARY KEY, TITLE VARCHAR(64), MEMO VARCHAR(1024));

ここで、列名1のIDにはAUTO_INCREMENT(オートインクリメント)が指定されています。AUTO_INCREMENTは、新しい行が挿入されるたびに自動的に一意の値が生成される列のことです。INT(整数)も指定されていますので、ここでは新しい行が挿入されるたびにIDに1,2,3…という値が入ります。

MySQLにおける操作例を以下に示します。ここではMEMOSというテーブルを作成しています。

 # データベースを選択します。 
 mysql> USE mydatabase
 Database changed
 mysql> CREATE TABLE MEMOS (ID INT AUTO_INCREMENT PRIMARY KEY, TITLE VARCHAR(64), MEMO VARCHAR(1024));
 Query OK, 0 rows affected (0.02 sec)

 mysql> SHOW TABLES; # テーブルが作成出来たかを確認
 +----------------------+
 | Tables_in_mydatabase |
 +----------------------+
 | MEMOS                |
 +----------------------+
 1 row in set (0.00 sec)

 mysql>

テーブル内のデータ検索

テーブルに含まれるデータの検索にはSELECT文を使用します。文法は以下の通りです。

SELECT * FROM テーブル名

SQLコマンドの実行例を以下に示します。もっとも、この段階ではまだテーブルにデータが入っていないので、SELECT文を実行しても何も返ってきません。

mysql> SELECT * FROM MEMOS;
Empty set (0.00 sec)

mysql>

テーブルへのレコード挿入

テーブルへのレコード挿入にはINSERT文を使用します。文法は以下の通りです。

INSERT INTO テーブル名 (列名1, 列名2, ...) VALUES (値1, 値2, ...)

SQL文の実行例を以下に示します。INSERT文を実行した後でSELECT文を実行すると、1件のレコードが登録されていることがわかります。

 mysql> INSERT INTO MEMOS (TITLE, MEMO) VALUES ('野菜リスト', 'じゃがいも、人参、たまねぎ');
 Query OK, 1 row affected (0.00 sec)

 # 1件レコードが登録されました
 mysql> SELECT * FROM MEMOS;
 +----+-----------------+-----------------------------------------+
 | ID | TITLE           | MEMO                                    |
 +----+-----------------+-----------------------------------------+
 |  1 | 野菜リスト      | じゃがいも、人参、たまねぎ              |
 +----+-----------------+-----------------------------------------+
 1 row in set (0.00 sec)

 mysql>

レコードの更新

テーブルに登録されているレコードを更新するにはUPDATE文を使用します。文法は以下の通りです。

UPDATE テーブル名 SET 列名2 = 値2, 列名3 = 値3 WHERE 列名1 = 値1;

上記のSQL文に出てくるWHERE句は一般的に条件句と呼ばれているもので、検索や更新などの対象レコードを絞り込むときの条件を指定するのに使用します。

SQL文の実行例を以下に示します。UPDATE文の実行後にSELECT文を実行すると、すでに登録されていたレコードの内容が変更されていることがわかります。

 mysql> UPDATE MEMOS SET TITLE = 'チキンカレーの材料', MEMO = 'じゃがいも、人参、たまねぎ、鶏肉' WHERE ID = 1;
 Query OK, 1 row affected (0.01 sec)
 Rows matched: 1  Changed: 1  Warnings: 0

 # 1 件レコードが更新されました
 mysql> SELECT * FROM MEMOS;
 +----+-----------------------------+--------------------------------------------------+
 | ID | TITLE                       | MEMO                                             |
 +----+-----------------------------+--------------------------------------------------+
 |  1 | チキンカレーの材料          | じゃがいも、人参、たまねぎ、鶏肉                 |
 +----+-----------------------------+--------------------------------------------------+
 1 row in set (0.00 sec)

 mysql>

レコードの削除

レコードの削除に用いるSQL文はDELETEです。文法は以下の通りです。

DELETE FROM テーブル名 WHERE 列名1 = 値1;

実行例を以下に示します。DELETEを実行した後にSELECT文を実行すると、1件あったレコードが削除されているので、再び何も返ってこない状態になります。

mysql> DELETE FROM MEMOS WHERE ID = 1;
Query OK, 1 row affected (0.01 sec)

# 1 件レコードが削除されました
mysql> SELECT * FROM MEMOS;
Empty set (0.00 sec)

mysql>

テーブルの削除

DROP TABLEを実行するとテーブルを削除できます。文法は以下の通りです。

DROP TABLE テーブル名

実行例を以下に示します。DROP TABLEの実行後にSHOW TABLESを実行すると、テーブルがなくなっていることがわかります。

mysql> DROP TABLE MEMOS;
Query OK, 0 rows affected (0.01 sec)

 # テーブルが削除されました
mysql> SHOW TABLES;
Empty set (0.00 sec)

mysql>

まとめ

今回はバックエンド開発に入る前のおさらいとして、今回開発しているメモアプリの概要(システム構成と画面および機能)、ならびにデータベースを操作する言語であるSQLの解説を行いました。

次回は以下の解説をする予定です。

  • APサーバーとDBサーバーの通信設定
  • 出来上がったコードベースでの解説
    • Rustを使ったバックエンド開発
    • Angularを使ったフロントエンド開発