絶賛、反省発売中。
IT屋全力反省会が書籍になりました!
ご購入はこちら
ITは本当に世の中の役に立っているのか?そもそもITなんていらないのではないか?……といった本質的な問いを胸に秘めながらも、第一線で活躍する二人のIT屋が、バズワードについて、Slerの幸せについて、データベースについて、クラウドについて、エンジニアのキャリアパスについておおいに反省したりしなかったり……エンタープライズITの現場の実情が立ち上る生々しい対話です。
Webでは読めない、神林飛志さん、井上誠一郎さんによる渾身のオリジナルまえがき、あとがき付き!
ぜひご反省ください!
データベースとストレージの境界
編集部 今日のお題はデータベースということでよろしくお願いします。
神林 データベース。いろいろな側面があります。まず技術的な話があります。あとは、ベンダーというかプロダクトというか、そういうビジネスをする面ってあまり語られていないですよね。でもそこは外せないという気がしています。ビジネスサイドの話、たとえば特許の話とか、プレーヤーの話ですよね。日本と国外のデータベースベンダーの位置づけっていうか、やり方っていうか、もうどんどん寡占化しちゃっているのが現状じゃないですか。そういうビジネスサイドの話と技術寄りの話があって、技術の話をする人はビジネスの話をしないんですけど、ビジネスの話をする人も、技術とは完全に違う話になってしまっていて、本来はどういう風にお金が流れるかとか、人がアサインされるかっていう問題があるんで、もうちょっとくっつけて話さないといけないんですけどね。そこが足りてない、そんな側面から話ができたらいいなと思います。
井上 まずは技術から行きますか。
神林 技術から行きますか。データベースがデータベースたるゆえんの技術ですね。要はデータベースというのは、僕からするとファイルシステムは違う。ファイルシステムではないっていう発想があるんですけど。要するにモノを収めて出すだけっていうストレージの役割として言うなら、データベースとファイルシステムはすごく似ている。ただ、やっぱりデータベースはデータベースでファイルシステムはファイルシステムで、違いがあってそれは何かっていうのが、データベースの基本的な技術だと思っています。ひとつはトランザクション。もうひとつはクエリ。
井上 そうですね。はい。
神林 もう1つ、リカバリがあるんですけど、これはファイルでもあるかなっていう気はするんですよ。
井上 リカバリはトランザクションの一環じゃないですかね。僕は、もう一つ挙げるならデータモデルかなと思っていて。データモデルとクエリは表裏一体のところがありますけれども。データモデルとクエリとトランザクション管理かな、と。
神林 それがあればデータベースって言っていいのかっていうところはあって、僕は言い切っていいかなと思っている。逆に言うとそれがなければデータベースと言っていいのかというのは微妙な感じに(笑)。
井上 まあ、便利な言葉で、データストアと呼んだりですね。
神林 データストアっていうのはやっぱりデータベースではないっていう認識なんですか。
井上 結構曖昧なときに使いますね。データベースとファイルシステムもさっき言った3つの観点で言うと違うんですけど、境界があいまいなことがあって、そこをちょっとごまかす時にデータストアとか使ったりしていますね。
神林 そのあたり、特にクラウド的なやつになってくると、データベースというよりはストレージですよね。たとえばオブジェクトストレージ、あれをデータベースと呼ぶのか。僕は違うと思っています。どうですかね?
井上 また前回のような言葉の定義の問題になるんですが(笑)、これは堂々巡りするところがあって……
神林 クラウドストレージはファイルシステムとは違うっていう認識なんですか?
井上 いわゆるオブジェクトデータベースですか、昔風に言うと。まあ、オブジェクトデータベースっていう言い方があるならそれで呼んでもいいかな、っていうくらいですね。
神林 昔のオブジェクトデータベースと、いわゆるODBMSですよね、いまのクラウド的なクラウドストレージっていうのは、やっぱり同じっていう認識なんですか?
井上 昔はそれこそ、オブジェクト間の関連みたいなものが強く出ていたのに対して、それと似ているのがドキュメントデータベース。最近のオブジェクトを突っ込むっていうのは、このドキュメントの流れっぽい感じですけど、もはやその境界は薄れているかな。
神林 やってていちばん話題になるのはjoinができるかできないかってところなんですね。そのへんが大きな違い。トランザクションはもう、最初からあきらめているところがあって(笑)。
井上 レベルの問題ですよね、トランザクションは。
神林 そこの境界が曖昧になっているよっていうのはどんな風に考えたらいいんですかね?
井上 そもそもデータモデルの話はいろいろ話したい気がしていて。リレーショナルモデルは数学的な基盤もあるし、素晴らしいものだと思っているんですけど、アプリケーションを作る立場からすると、別にリレーショナルモデルだけが唯一のモデルじゃないっていうのが、これは自明だと思うんですよ。なので、アプリケーションからすると、実際のアプリケーションのメモリで見れば、ツリーも持っているし、オブジェクトもグラフだし、配列もあるし、それが自由に永続できるものっていうのは、アプリケーションサイドからすると非常に便利で、データストアの行く先としては正しい姿ですね。
神林 それはデータベースとは違う、実際にはバイナリで入っちゃうよみたいな、一時期のRDBはなんでも入るよみたいな話になってしまって。
井上 まあ、今でもなんでも入れられる、なんでもJSONにしろ、バイナリだろうと……
神林 まあ、JSONストレージが、たとえばMongoDBなんかが代表的ですけど、ああいうのが僕はJSONストレージだと思っているんですね。
井上 JSONストレージですよね。
神林 それがデータベースかっていうと違うだろと。ただ、みんなMongoDBっていう言い方をしている。データベースって言っているけどそれ、違うんじゃない?と。
井上 ちょっと分けたいのは、言葉としての正しさと、有用か有用でないかって話。言葉の定義はどっちでもいいかな、という気がしていて。データベースと作っている人間が呼んでいて、ファイルシステムとの明らかな違いでデータモデル、クエリ言語があって、トランザクションはレベルがたくさんありますけど、まあ、一応少しあれば、データベースと呼んでいいかなと。最初の3つをデータベースの定義とするならですね。
MongoDBもCassandoraもそうですけど、トランザクションのレベルが低いとしても、データモデルがあってクエリ言語があるので、データベースだと思うんですよ。で、その話と有用か有用じゃないかはまた別の話だと思うんですよね。
神林 なるほど。データベースっていう言い方をしたときに、普通のユーザーからみると、間違いなく頭に浮かぶのはRDBだと思うんですね。それはデータベースですよっていう言い方をした時に、何も知らない人からしたら基本的にRDBと同じことができるのかと思ってしまう。で、それができないっていうと、アレ?っていう話にはなるんですよね。そこは、少し問題にはなっているところがあって、たとえば、RDBしか使っていないようなひとがスケールアウトするRDBみたいな言い方でNoSQL系が出た時に、やってみたら全然違うよねってなって、割とギャップがありましたと。
井上 ギャップはあるでしょうね。
神林 そこらへんはちゃんと交通整理をするっていう意味では、少なくとも売るほう、売るほうっていうか、SIするほうもそうですけど、それからプロダクトを売るほうも、ここまではストレージで、こっから先はデータベースっていうのはちゃんと線を引いておくべきだと思うんですね。そのときの基準としてのデータベースはRDBであるべきだと私は思っているんですよ。
井上 僕にとってのデータベースの基準は、データモデルがあること、クエリ言語がなんらかの形であること、それからトランザクション管理があること。で、たまたま最初のやつがリレーショナルモデルで、たまたま2番目のものがSQLで、ACIDレベルのものがあるっていう認識。
神林 であれば、全然、データベースですね。
井上 で、そこから外れたらもうデータベースではない、と。でもそれってリレーショナルモデルじゃないとダメなんですか?
神林 モデルはなんでもいいと思います。
井上 SQLじゃなくてもいいですよね?
神林 SQLじゃなくてもいい。クエリがちゃんと、まあ、joinができるっていうのが前提ですよ。
井上 あ、joinができることが前提?じゃあ、それを4つ目の条件に……
神林 いや、joinできないクエリって、そもそもクエリって言っていいんですか。
井上 この中ではクエリをあの、APIのイメージを持っていて、そしたらファイルパスで……
神林 そうするとファイルで、パスで呼んでくれるから、それはクエリとは言わないですね。
井上 それはやっぱりレベル感かもしれませんね。ファイルシステムはファイルパスという1つのクエリがあるという見方もできるので、もしかしたらファイルシステムとデータベースの境界ではないですかね。joinできるかどうかは半分データモデルの気もする。
神林 joinできるかどうかは、データモデルもありますけれども、正規化できていないとjoinできないのでモデルに依存している部分もあると思うんですよね。そもそも正規化しなくても入ってしまうようなものですよね。できなくはないですけれども、そういう意味だとやっぱりjoinができるとは言わないですね、一般の人は。
井上 joinができるからデータベースであると定義してしまうと、グラフでちゃんとした、かなり複雑なクエリまでACIDもできましたっていう場合でも、joinがないとデータベースじゃないっていうことになっちゃう。そうなると、もはやデータベースイコールRDBになってしまう気がしますね。言葉の定義として。
神林 そうなっちゃうかな。
井上 言葉の定義としてですけどね。データベースの定義としては、データモデルと―ちょっとクエリ言語が話しているうちに微妙な気もしてきたんですけれども―、トランザクション管理。これもレベルがあるんですけれども、これがあることがデータベースとファイルシステムの違いで、リレーショナルモデルはSQLとACIDのレベルがきれいにまとまっているひとつ。
神林 NoSQLって、やっぱりきれいにまとまっていないですよね。
井上 ものによるかと。たとえば、Cassandra。別にCassandraを擁護しなければいけないわけじゃないんですけれども(笑)、最初の頃の簡単なKVSではなくてビッグテーブル型のデータモデルがあって、CQLというSQLのパクリみたいなものがあって、トランザクションのACIDではないですけれどもある程度のレベルがあって、と見ると、まあ1つのデータベースということになるのでは。
神林 そういう意味で言えば、HBaseなんかもそっちに寄ってきてほしいという話になる。NoSQL系って明確に分かれているような感じがしたりしてそういうデータベースに寄っているものと、完全にストレージとして割り切っているというようなオブジェクトストレージとしてみたいなところがあるかなと。
井上 あるかもしれないですね。あるかもしれないし、KVSもデータモデルとか言い出すと……
神林 あれはデータモデルとは言えないと思いますけどね。そういう意味だと、ファイルシステムとあまり違いはないですね。テーブルモデルがあるかないかの違いでRDBとは線を引くのであって、ファイルシステムとオブジェクトストレージがどこが違うかというと原理的にはそんなに変わってないですよね。そうするとオブジェクトストレージ…
井上 …とデータベースの境界は、さっきの3つの基準でなんとなく分けられるけれども、ちょっとグレーゾーンもあるのかな、と。