読者です 読者をやめる 読者になる 読者になる

Blank?=False

「呉下の阿蒙にあらず」をモットーにしたITエンジニアの日々

NoSQLとは

先日、MongoDBの記事を書きました。

stonebeach-dakar.hatenablog.com

そもそものNoSQL自体をよく知らないので勉強してみました。

NoSQLって何?

Not Only SQLの略で、RDB(リレーショナルデータベース)以外のデータストアをそう呼びます。
ただ、このNot Only SQLの解釈は人によって違い、SQLだけじゃないとか色々有るようです。

内部的なデータ構造はKVSドキュメント指向データベース等があります。

KVSて何?

Key Value Strageの略で、1つのキーに1つのデータが関連付けられたデータストアのタイプです。
プログラミングで言えばハッシュがそれに当たります。

RDBでも1つのテーブルに主キーがあって、その主キーを使うことでそのキーに従属したデータを取り出せる様になっています。
ただ、主キーがないテーブルもあるので、KVSは必ずキーを必要とする点がRDBのデータ構造と異なります。

ドキュメント指向データベースって?

RDBではスキーマ(テーブルのデータ型とか長さとか)を持っており、そのスキーマに適合しなければデータを保存できません。
このドキュメント指向データベースはそのスキーマを持たず、基本的になんでも受け入れます。
MongoDBならバイナリも受け入れることができます。

この柔軟さを活用して、オブジェクト指向プログラミング言語のオブジェクトをそのまま保存したりといった用途にも使われるようです。

どんなソフトウェアがあるの?

Cassdandra

Apacheが開発するオープンソースのNoSQLデータストア。
もとはFaceBookが大規模データストアとして開発、オープンソースとして公開された後その後Apacheへ移行したもの。

内部データ構造はKVSを採用している。
もっとも完成されたNoSQLで、すでに多くのシステムでの実績あり。

Wiki先生に聞いてみると,

キーは複数の値にマッピングされ、これらはcolumn familyとしてグルーピングされる。
column familyはCassandraデータベースが作成される際は固定されているが、後にfamilyに対し列を追加することは可能である。
さらに、列は特定のキーにのみ追加されるので、どのfamilyにおいても異なるキーは任意の列数を持つことができる。
各キーに対応するcolumn familyの値は連続して記録され、このことによりCassandraは列指向データベース管理システムと行指向データベースシステムの複合型であると言える。
Apache Cassandra - Wikipedia

(゚Д゚)ハァ?

何言ってるんだかよくわからん。

MongoDB

前回の記事を見てください。

stonebeach-dakar.hatenablog.com

MySQL

MySQLそのものはRDBプラグインを導入することでNoSQLデータストアとして使えるようになる。

RDBを置き換えるものではない

RDBより処理速度が早い!よし採用! なんてのはちょっと待って下さい。
速いことは速い、ただしRDBで出来てNoSQLではできない、ということはとても多いです。
よって、 NoSQL > RDB ではありません。

世の中そんなうまい話はない!

あくまで限定用途向けのDBMS

基本的にNoSQLは「結合」が苦手です。
なので、幾つかのテーブルにデータを分けておき、必要な時にJOINしてデータを取り出す…と言った用途には向きません。

幾つかのテーブルに分けることができない、ということは正規化できないわけです。
なのでいくつかの重複するデータをNoSQLデータストアでもつ必要になります。

こういった事情から、NoSQLは単純なデータを大量にもち、高速に読み書きするといった用途に特化しているといえます。

RDBMSでだいたいのことは出来る

ぶっちゃけ、RDBMSで何に困っていますか?
読み込みが遅いとか処理が遅いというのはあるかもしれません。
でもそれはネットワークの通信速度がボトルネックだったり、パフォーマンスが出ないアルゴリズムだったりと色々な可能性があります。

データの読み書きはSQLでたいてい事足りますし、SQLでできないことはアプリケーション側で解決できます。
複雑なSQLを書くしかないから…と言う話もありますが、NoSQLのデータ問い合わせでも複雑に書けるのでそこまで大きくは変わらないと思います。

こういったボトルネックを解決して、さらに高速化したいといった時に選択肢に上げることはできますが、上記でかいたとおり、置き換えられるものではないので 一部一部にNoSQLでデータを管理する、という使い方になるのではないでしょうか。

RDMBSの速度改善

そもそものRDBMSの速度のボトルネックとなっていたのはHDDのアクセス速度です。
SAP HANAを始めとして昨今はメモリの大容量化により、すべてのデータをメモリ上に置くことでRDBMSの速度を改善した製品が出て来ています。
また、フラッシュストレージサーバー等でHDDを使わずオールSSDによるデータベースも構築出来るようになってきているので、 一昔前程速度ガー、という話はあまり聞かなくなってきています。

じゃあNoSQLって結局いらない子?って思いわれそうですよね。

ぶっちゃけ、個人的には真面目に勉強して使いこなす程の価値はまだないかな・・・と思います。
というより、エンタープライズな案件だと信頼性が低い(トランザクションの問題など)で本採用されることは殆どないので、TwitterFaceBookのようにBtoCな案件で使うことになるのかなと

どう使っていくか

最近の仕事のメインがExcelAccessVBAでのデータ処理プログラム開発なのですが、ここで大量のCSVファイル(1000個超とかもザラ)を読み込んで解析するプログラムを書くことが有ります。
こういった時にVBAの配列やワークシートに全部のファイルを読み込んで、上から下に探索するようなプログラムを書かざるを得ない事があります。
こういった、単純な大量のデータをNoSQLデータベースに読み込んでおいて、必要な時にデータを取り出せるようなインターフェースを作るとNoSQLのメリットを引き出そうです。

関係データベースのような様々な関係性を使ったデータストアではなく、単純に同じ形のデータを大量に持ち、何回も検索するとかそういった用途に向いていると思います。

CodeZineにもそんな感じで解説されていました。
codezine.jp

そういえばこんなの作ってた。

NoSQLを勉強してみて、VBAで開発したデータベースライクな汎用データクラスに似ているなーと感じました。

github.com

もともとはExcelでワークシートでデータの保存とかをやると処理速度的に遅いので、メモリ上で使える2次元データ構造がほしかったので作ったものです。
説明が超テキトーですが、ようはハッシュ表のそれぞれのキーに1行分のレコードを持つという感じです。
元ネタはRubyOnRailsのActiveRecordが実際にデータを持てるとしたら…という感じで考えました。

GitHubに上げているものはバージョンが古いのですが、現在はWHEREにも対応し、ほぼNoSQLのように使える様になっています。
実際のNoSQLはもっと色々考えられているのですが、イメージとしてはこれのスゴイヤツかな、という感じ。

まとめ

今回、データベースのデータ構造とかそういったものを初めてまともに勉強したわけですが、半分くらいよくわかってません。
データベーススペシャリスト試験では出てこないと思いますが、こういうことを理解しておけばよりデータベースの活用提案ができていけそうだなと思いました。

参考文献

qiita.com