第3回となりのエンジニアでは、GMOクラウドの開発エンジニアの山本さんにNoSQLとは何か、分かりやすく教えてもらいました。
ー山本さんについて教えてください。
田:山本さんはGMOクラウド歴が長いイメージなんですが、いままでどのようなお仕事をされていたのか、教えていただけますか?
山本:僕は、今年で16年目になりまして、まだGMOクラウドがアイルだった頃からいますので、いろんな仕事をこの会社で経験しました。
田:16年目ですか!長いですね・・・!はじめからエンジニアをされていたんですか?
山本:はじめは、お客さまサポートで電話を取っていました。そこから一部情報システムの業務も担当することになり、技術的な知識も増えていきましたね。その後、運用や企画技術サポートを担当する機会もあって、今はサービスの開発を行っている感じですね。
田:様々な部署や仕事内容を経験されて、今開発エンジニアをやられているんですね!歴史を感じます・・・!
山本:そうですね。笑
田:いままでどのような開発をされましたか?
山本:大きいものだと、社内システムの設計やDNSの新システムの設計あたりですね。DBに絡めていうとDNSのゾーンのデータがMySQLに入っているので、そこの設計やチューニングも行っていました。
ーNoSQLってなんですか?
田:先ほどMySQLというワードが出てきましたが、本日はNoSQLについて教えていただきたいと思っています。そもそもNoSQLとはなんですか?
山本:NoSQLとは、データベースの1つのカテゴリとなりますので、理解するためには、データベース全体について簡単に理解しておく必要があります。
まず、データを溜め込んでいるものは全てデータベースと呼ばれます。大まかに分類すると以下のようになります。
山本:図にかいた通りデータベースを分類すると、RDBMS(リレーショナルデータベースマネジメントシステム)とNoSQLに分けることができます。
RDBMSはSQLという言語を使ってデータを出し入れしたりします。
それに対して、NoSQLはNot only SQLの略で、その名の通り、SQL言語を使わずにデータの操作ができるデータベースを指します。
田:なるほど!NoSQLって名前の通り、SQLという言語を利用しなくても操作できるってことだったんですね。
田:RDBMSとNoSQLの違いがまだイメージ湧かないので、もう少し具体的に教えてください。RDBMS(リレーショナルデータベースマネジメントシステム)って難しそうなワードですが、どのようなデータベースなんですか?
山本:RDBMSは難しく聞こえるかもしれないですが、直訳すると関係データベースになります。その名前からも想像できるかと思いますが、データベース内のデータに関連性があるんです。そのため、表形式でデータを格納しています。
分かりやすく書籍データ関連モデルで考えてみましょう。書籍自体には様々な情報がありますね?RDBMSでは書籍Aに付随した情報(関連性のあるデータ)を表形式で管理しているんです。
図にするともう少しイメージしやすいでしょうか。
田:図にすると一気にイメージが湧きますね。普段仕事で使うエクセルもこのようにデータを管理しますよね。
山本:そうですね。エクセルも表形式なので、そのようなイメージを持ってもらって大丈夫です。
田:RDBMSに関しては、だいぶイメージできるようになりました。NoSQLはどんなデータベースなんでしょうか?
山本:さきほども少し触れましたが、SQL言語を使わずにデータへ接続できるデータベースを総じてそう呼んでいます。今日では、Key-Value型データベースを指して言うことが多いと思います。これは、Key-Valueストア(KVS)とも呼ばれます。Key-Valueストア以外には、XMLやJSONなどがよく利用されていると思います。
田:NoSQLにもいくつか種類があるんですね。中でもよく使われるKey-Valueストアについて教えていただけますか?
山本:Key-Valueストアも名前の通りで、保存したい値(Value)に対して、一意の標識(Key)をつけて保存する方式です。
これも例をあげてみましょう。Keyを県名、Valueを県庁所在地に例えるとわかりやすいでしょうか?
田:なるほど、RDBMSでは1つのデータに対して、関連性のあるデータが複数ひもづいていましたが、NoSQLのKey-Valueストアでは、1つのKeyに対してデータは1つなんですね。
山本:そういうことです。1Key:1データの関係で成り立ってるデータの保存形式がKey-Valueストアであると覚えていただいて問題ないです。
田:RDBMSはエクセルのように表形式としたら、1keyに対して1データという意味では、テキストファイルとかのイメージに近いですか?
山本:そう考えることもできますね。その場合フォルダがDBでファイル名がKeyで、DBの中でKeyは絶対にユニークである必要がありますね。同じフォルダ内に同じ名前のファイルは作れないですからね。さらにファイルの中身は1つのみデータが入っているというイメージを持ってもらって大丈夫です。
ーRDBMSとNoSQLそれぞれの特徴について教えてください。
田:RDBMSとNoSQL(主にKey-Value)の保存形式の違いについてとてもよく分かりました。それぞれの特徴について、もう少し教えていただけますか?
山本:RDBMSとNoSQLの主な違いは、何度か触れていますが、SQL言語を使うか使わないかにあります。RDBMSは、複雑なデータ構造を持つデータの取り扱いに向いている反面、その複雑さによりデータの肥大化によるDBの性能劣化を招きやすいんです。また、SQL言語を習得する必要もありますね。
田:複雑なデータを取り扱うから、データが多くなりすぎて、DBの性能劣化も起こり得るんですね。NoSQLはSQLを使わないから、SQL言語の習得も必要ないということですね?
山本:その通りです。SQLを使わないので、NoSQLは基本的に一般的なプログラムの知識があれば操作できるものがほとんどです。
実際に書いてみますね。NoSQLの場合、PHPだけで完結しますが、RDBMSを使う場合は、PHP+SQLで記述する必要がありますので、少し手間がかかります。
【PHPの場合(NoSQL)】
1:$mem = new Memcached();
2:$mem->addServer('127.0.0.1',11211);
3:if( $mem->add("mystr","this is a memcache test!",3600)){
4: echo '成功';
5:}else{
6: echo '次に値が保存されています:'.$mem->get("mystr");
7:}
1: memcachedのクラスを読み込み
2: memcachedのサーバを設定
3: mystrをキーにして、this is a memcache test!という値を保存して、保存の成否を判定。数字は、有効期限
4: 成功(戻り値がTrue)の場合、成功を表示
5:
6: 失敗(戻り値がTrue以外)の場合、メッセージとmystrのキーの保存されている値を表示。
7:
※参考:http://php.net/manual/ja/memcached.add.php
山本:このコードは、PHPのDocumentにあるプログラムですが、用意されている関数だけで、値の保存と呼び出しができています。
SQLを使う場合、前準備として、データベースとテーブルを作成しておく必要があります。
【PHP+SQLの場合(RDBMS)】
1:create databases `test_db`;
2:create table `database_name` (`column1` varchar(20),`column2` text);
3:プログラム
4:$db_host = "localhost";
5:$db_name = "test_db";
6:$db_user = "user";
7:$db_passwd = "passwd";
8:
9:
10:
11:$con_text = "mysql:host=$db_hostt;dbname=$db_name";
12:$dns = new PDO($con_text,$db_user,$db_passwd);
13:$insert_sql = "Insert into `database_name` (`column1`,`column2`)values(\"mystr\",\"this is a sql test!\")";
14:$dns->query($insert_sql);
15:$select_sql = "select column1,column2 from database_name where column1 = \"mystr\"";
16:foreach ($dns->query($select_sql) as $row);
17: print $row['column1'] . "\t";
18: print $row['column2'] . "\t";
19:}
1: データベースを作成するSQL
2: テーブルを作成するSQL
3:
4: データベースのホスト名を変数に設定
5: 接続するデータベース名を変数に設定
6: 接続するユーザを変数に設定
7: 接続するユーザのパスワードを変数に設定
*直接各必要とする箇所に直接記載も可能ですが、変更があった際に修正が困難になるため、変数に代入するのが一般的です。
8:
9:
10:
11: データベースへ接続するため情報を代入
12: PDOクラスを利用して、データベースに接続
13: テーブルにデータを入れるためのSQL文を作成
14: SQL文をデータベースに送信
15: テーブルからデータを取り出すSQL文を作成
16: SQL文をデータベースに送信して、対象のデータを$rowに代入して、データを取り出す。
17: column1のデータを表示
18: column2のデータを表示
19:
山本:プログラムの全体量は、RDBMSの方が少し多いくらいですが、事前準備として入れ物を用意しておく必要と、データをテーブル入れる際にテーブルの仕様を決めておく必要があり、かつデータの出し入れ、更新の際にもSQLの知識が必須となります。
田:プログラムの内容をみるとやはりSQLを使っている方が、複雑そうですね。
山本:そうですね。また、NoSQLはRDBMSと違って、単純なデータ構造で、データ数が多いものに向いているので、データが肥大化しても性能の劣化を招きにくいんです。
まとめると以下のようになりますね。
RDBMS ・・・複雑なデータに向いている。データの肥大化による性能劣化が起きることがある。
NoSQL・・・単純なデータに向いている。データが肥大化しても性能劣化が起こりづらいが、複雑なデータは苦手。
田:なるほど。。それぞれ得意不得意があるんですね。
ーなぜ最近NoSQLが注目されているんですか?
田:NoSQLというワードは、最近よく耳にするようになったのですが、なぜ注目されているのでしょうか。
山本:最近では、ネット人口が増えたり、回線も早くなりました。それに伴い、複雑でない巨大なデータを扱うことが増えてきました。そこで、この膨大のデータを簡単に取り扱え、教育コストも低いNoSQLが脚光を帯びるようになったのです。
田:確かにデータはどんどん増えていきますよね。いわゆるビッグデータというやつですよね。NoSQLが注目されるのも納得です。
山本:そうですね。それだけでなく、データ構造が単純な分スケールアウトしやすい傾向にあるため、性能が劣化した場合でも対応しやすいという面でも評価されていると思います。
田:NoSQLのおすすめな使い方などありましたら、教えていただけますか?
山本:NoSQLのおすすめな使い方というより、ぼくは取り扱うデータにあわせてRDBMSとNoSQLを適切に使い分けることが大事だと思いますので、使い分けについて少し説明しますね。
まず、NoSQLはとにかく大量のデータを保持することに向いています。データの参照には適していますが、データの更新や削除には向いていないので、取っておく必要はあるけど、普段頻繁に利用しないデータには最適なんです。
田:たとえばログデータのようなものでしょうか?
山本:そうですね。他には画像や動画データ、バイナリデータ(大量のシンプルなデータ)なども適していますね。その性質上、オブジェクトストレージとの相性も良いんです。
>オブジェクトストレージの活用記事はこちら
田:では、RDBMSはどのような場合に適しているんでしょうか?
山本:RDBMSはトランザクション処理が行えるから、一貫性を保つ必要があるデータに向いてます。
田:トランザクション処理・・・なんだか難しそうなワードですね。
山本:トランザクションは、処理の一貫性を保証するために、関連する一連の処理全体を一つの処理単位として管理する仕組みなんです。つまり同時に処理が行われることを防げるんですね。
たとえば、ECサイトでものを買うとき、在庫が一点しかないのに、AさんとBさんが同じタイミングで購入ボタンを押した場合、両方に購入できたらダメですよね。こういう一貫性を保つ必要があるデータにはトランザクションは必須なんです。
田:私もよくECサイトで買い物しますが、データの一貫性はトランザクションによって保たれているんですね・・・!
山本:そうです。なのでECサイトやお店の予約サイトなど一貫性を保つ必要があるデータにはRDBMSを使う必要があるんです。ただ、最近ではこのような問題をNoSQLでも解決できるようにする動きも出てきていますので、RDBMSとNoSQLを1つのシステムで使えるものも今後増えてきそうですね。
田:1つのシステムで両方使えるようになったら、互いの短所を補えるので、使い勝手が良さそうですね!DBは難しいイメージを持っていたので、苦手意識があったのですが、NoSQLについてもだいぶ具体的にイメージできるようになりました。分かりやすく教えていただき、ありがとうございました!