Ch.4 データベース(NoSQLよりもRDBMSを中心とします)|『Webエンジニアの教科書』まとめ #4

f:id:lib-arts:20190126200443p:plain#1では連載の経緯と課題本とした『Webエンジニアの教科書』の1章についてまとめました。

詳細は#1を読んでいただければと思いますが、技術開発系の仕事をするにあたってはこだわりや尖ったスキル(例えば機械学習やる上での数学やフロントやる上でのデザインスキルなど)がない場合はWeb開発者のキャリアパスを目指すのが良いと思います。この連載では未経験者・初心者向けにWeb技術の入門にあたる内容をまとめていきます。スクールに通うかどうか迷っている方などをメインの想定読者として考えています。

#2、#3では課題本の2章のRuby on Railsの08までを取り扱いました。

 09、10でテストやgemについてまとめられていたのですが、連載の前提が初学者のためここは一旦飛ばす方が良いと感じますので飛ばします。また、サーバサイドをRubyPHPの二つ知るメリットもそこまでない(PHPはWebに特化し過ぎていて変な癖がつくのでよくない)ので、Ch.3も飛ばしたいと思います。
#4ではCh.4に関連してデータベースについて取り扱いますが、初心者前提であればNoSQLは言葉だけでRDBMSの基本を知る方が最初は良いのでMariaDBをベースとしたRDBMSについて解説したいと思います。

f:id:lib-arts:20190126200245p:plain

from "https://www.amazon.co.jp/gp/customer-reviews/R2GFY4A1NGT6EZ/"

ちなみに本のレビューとしては上記がちょっと辛口ではありますが参考になるレビューなので紹介しておきます。RDBMSの説明はもう少し詳しくても良かったのではというのは感じます。
以下今回の目次になります。
 
1. RDBMSに関して
1.1 RDBMSとは
1.2 MariaDBの導入
1.3 MariaDBを用いたSQLの実行
2. NoSQLに関して(軽く流します)
3. まとめ


1. RDBMSに関して
1.1 RDBMSとは

RDBMSとはRelational Database Management Systemの略で、データベースを操作するシステムの中でも、表の組み合わせを行うことでデータを整理して取り扱えるようにしたものです。RDBMSを深く学ぶと深いですが、最初から全てやろうとすると大変なので一旦基本的なコマンドとして、select、inner join、where、like、order by、group byなどを知っておけば十分です。

関係データベース管理システム - Wikipedia
具体的な詳細情報は上記のようにWikipediaなどでもまとまっていますが、仕組みから勉強するよりも実際に動かしながら納得する方がイメージがつかみやすいので1.3で動かしながら説明するとしてここではあまり詳しく説明しないようにします。
以後の流れとしては、この後の1.2ではRDBMSのライブラリの一つであるMariaDB(以前はMySQLだったのですが、買収などの影響でMySQL派生でMariaDBができました)についてのインストール、1.3ではMariaDBを用いたSQLの実行について取り扱えればと思います。


1.2 MariaDBの導入

MacLinuxの場合はosにあったコマンドでインストールが可能です。Macの場合は"brew install mariadb"でインストールすることができます。

f:id:lib-arts:20190126204356p:plain
MariaDB.org - Supporting continuity and open collaboration
Windowsの場合はMariaDBは上記公式からダウンロードが可能です。msiファイルのインストーラをダウンロードしたら、インストーラを実行してインストールを行なってください。基本的にはデフォルトでの実行で問題ないと思います。

インストールが完了したら下記に従うことでインストールを確認することができます。

LinuxMacの方
→ ターミナル(シェル)から『$ mysql.server start』でサーバを起動させたのちに『$ mysql』を叩いてみてください。

 

Windowsの方
→ スタート画面からMySQLクライアントを立ち上げてみてください。

上記が確認できればインストールについては大丈夫です!


1.3 MariaDBを用いたSQLの実行

◆ 基本的な内容の実行

1.2の手順でMariaDBを立ち上げたら、次は実際に使ってみましょう。

MariaDB [(none)]> create database sample1;
MariaDB [(none)]> use sample1
MariaDB [sample1]> create table goods(id int, name varchar(20), price int);
MariaDB [sample1]> insert into goods(id,name,price) values(1,"apple",200);
MariaDB [sample1]> insert into goods(id,name,price) values(2,"orange",100);
MariaDB [sample1]> select * from goods;

実行結果は下のようになります。

f:id:lib-arts:20190127145739p:plain

ここで主に使用しているのは「CREATE文」、「INSERT文」、「SELECT文」です。まず、「CREATE文」はデータベースやテーブルの作成を行う文と一旦抑えておくと良いです。データベースとテーブルについてはテーブルは一つの表、データベースはいくつかの表をまとめて取り扱ったものです。テーブルはデータベース単位で保持しているので、データベースを選択するにあたってuseを用いています。

「INSERT文」はテーブルにデータを挿入する文だと考えておくと良いです。「insert into テーブル(列名) values(挿入する値);」で実行するとテーブルにデータを挿入することができます。

「SELECT文」はテーブルからデータを引っ張ってくる文です。「select 列名 from テーブル名」が基本の構文になります。*は全ての列の値を引っ張ってくるという意味です。

 

◆ INNER JOINを用いたテーブル結合

INNER JOINを用いたテーブル結合について説明するにあたって具体的な例があると望ましいので、下記のように新しいテーブルを作成します。

MariaDB [sample1]> create table sales(id int, good_id int, sale_quant int);
MariaDB [sample1]> insert sales(id, good_id, sale_quant) values(1, 2, 5);
MariaDB [sample1]> insert sales(id, good_id, sale_quant) values(2, 1, 3);
MariaDB [sample1]> insert sales(id, good_id, sale_quant) values(3, 2, 1);
MariaDB [sample1]> select * from sales;

上記を実行すると下記のように新しいテーブルができていることが確認できます。

f:id:lib-arts:20190127153434p:plain

テーブルの作成(CREATE)、データの挿入(INSERT)、データの取得(SELECT)までは先ほどと同様ですが、ここで注意すべきなのは先ほどは商品の情報(マスタデータ)だった一方で今回は売り上げの情報(トランザクションデータ)です。マスタデータでは商品の情報で一意ですが、トランザクションデータでは商品は取引の度に出てきます。この際に商品のマスタ情報をトランザクションに含めて保持することもできるのですが、これだとデータが重複してしまい無駄が大きいです。このため正規化という処理を行い、マスタとトランザクションにデータを分けて管理し、必要に応じてJOIN文を用いたテーブル結合を行います。この際のJOIN文におけるテーブル連結がRDBMSにおけるリレーショナルな部分の中核になります。

MariaDB [sample1]> select * from sales inner join goods on sales.good_id=goods.id;

具体的には上記を動かすことでテーブルの連結ができます。

f:id:lib-arts:20190127153506p:plain

ここで商品の価格の情報はsalesテーブルに含めていなかったもののJOINによる連結で取得した形になります。このようにテーブル連結によって様々な処理が実現可能になります。

 

1.4 ORマッピングRDBMS
近年ではWebアプリケーションのフレームワークからオブジェクト指向的な形でデータベースを取り扱うということも多くなっています。これをORマッピング(Object Relational Mapping)と呼んでいます。Ch.2で扱われているRailsPython製のフルスタックのフレームワークであるDjangoだったりなどでは直接SQLを叩かなくてもDBとのやりとりが実現できるような形になっています。

この辺は追々出てきてからで十分だと思うので、今回記事ではRDBMSの簡単な仕組みや雰囲気をつかんで、キーワードを抑えておき、それぞれ詳しく勉強する際に詳細を掴む形で大丈夫だと思います。


2. NoSQLに関して(軽く流します)

従来はDBと言えば基本的に1節でまとめたRDBMS一択のような状態でした。が、最近ではNoSQLというリレーショナルでない技術に関しても普及してきています。普及の理由としては、大規模なWebサービスが多くなってくるにつれて大量のアクセスを捌くなどRDBMSの特性上難しい状況なども出てきたことを受け、単純に早く結果を返すだったり大量のデータの書き込み処理だったりなど処理の高速化や大規模化にあたってのベストエフォートとしてNoSQLというリレーショナルでないDBの仕組みについても近年出てきています。
本ではRedisとMongoDBが紹介されているのでそれぞれご興味おありでしたら軽く読み流してみるのが良いと思います。(初心者前提であればNoSQLは聞いたことあるなで一旦十分かと思います)


3. まとめ

本ではNoSQLが中心になっていますが、データベースというところにデータを集約してそれをなんらかの形で保存したり取り出したりするイメージを最初は大事にすると良いかと思います。

それぞれの技術そのものは結局それぞれ要件に合わせて色々と技術が出てきた形なので、目的に応じて適切なものを使用できるようにしていければ良いと思います。