後半部分がけっこう書きかけのままです…! 何かアドバイスがある方がいましたら、@ts_3156に教えてもらえると助かります…!
えごったーというアプリケーションを開発している都合上、大規模なソーシャルネットワークデータを扱う方法をよく考えています。
その過程で色々なDBを検討するので、その思考過程をまとめておきます。
私が、大規模ソーシャルネットワークデータを利用して実現したい機能は以下の通りです。
- フォロー・フォロワーがそれぞれ約8000人規模(もっと多いこともある)の複数のユーザ、の共通のフォロー・フォロワーを見つける
- あるユーザからの距離がn以下であるユーザ一覧を見つける
「このページの情報間違っているよ。」という方がいましたら、遠慮なく@ts_3156までご連絡ください…!
NOSQLと従来のRDBMSのどちらを使うべきか
まず、MySQLに代表される従来のRDBMSは、ソーシャルネットワークデータを扱うことにあまり適していないらしいので、検討対象外とします。
ツイッターなんかはいまだにMySQLを使っているみたいですし、お金をかけてサーバをクラスタリングすれば、RDBMSでも大丈夫なんだろうとは思います。ただ、個人開発者にそんなお金はないので、以下このページでは、NOSQL(Not Only SQL)データベースに限って話を進めていきます。
従来のRDBMSでは何故駄目なのか(補足)
従来のRDBMSでは何故駄目なのか、具体例を使って一応説明しておきます。
なんで適していないのかあまりちゃんと理解していないんですが、たぶん以下のようなテーブルの結合演算にコストがかかりすぎるんだと思います。
コストがかかりすぎる例として、ツイッターのフォロー関係を挙げます。Aというユーザのフォロワー一覧を取得したい場合には、普通にいくと以下の手順が必要だと思います。
- Table1からAというユーザのデータを取得
- 取得したAのデータから、フォロワー一覧を取得するキーを作成
- フォロワー一覧取得キーを利用して、Table2からAのフォロワー一覧を取得する
この操作の中では、Table1とTable2のデータをそれぞれ取得して、結合する操作が必要になります。フォロワーが多くなると、Table1から取得するデータは1レコードなのに、Table2から取得するデータは数千レコード、ということになってしまいます。たぶんこのあたりがまずいんじゃないのかなー?(勘ですが)
NOSQLデータベースにはどんな種類があるのか
ざっくり大別すると、NOSQLには下記の4種類があります。
- キー/バリューストア(Key-Value-stores)
- BigTable実装
- ドキュメントストア(Document-stores)
- グラフデータベース(Graph Databases)
※上記の4分類はこのページより引用
上記の4分類は全部NOSQLデータベースの仲間です。実装方法の違いによって上記のように分類されています。
NOSQLの具体的な実装例
上記の4分類について、さらに具体的な実装例を以下にあげます。
各種NOSQL DBのメリット・デメリット
すごくざっくり言うと、各種NOSQL DBは、おおよそ以下のような特徴を持ちます。
- データの取得が高速
- データの(ディスクスペース的な意味での)保存効率が良い
- 開発途上でありまだ製品レベルではない
※あくまでもざっくりとした特徴です!
もっと詳しい説明は、以下のページを参考にしてください。とても詳しく解説してあります。
2010年6月15日の記事
2011年1月頃の記事
・「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
私の望みの機能を実現するにはどのDBを採用すべきか
※この部分はまだ書きかけ
『あるユーザからの距離がn以下のユーザ一覧を取得』という機能を実現するにはグラフ演算が必要そうなので、たぶんグラフデータベースがいいんじゃないかと思う。
『フォロー・フォロワーがそれぞれ約8000人規模(もっと多いこともある)の複数のユーザ、の共通のフォロー・フォロワーを取得』という機能はどのDBを使うのがいいのかな?
どのDBを採用するにしても、「一つのオブジェクトに与えられるメモリ量は言語の実装に依存」という問題がある? 例えば、仮にJava言語で一つのインスタンスに割り当てられるメモリ量が1MByteまでだとすると、フォロー・フォロワーが数万人規模のユーザのデータを1つのインスタンスにすることはできないのではないか、みたいな。
GraphDBの得意な分野
※この部分はまだ書きかけ
最短経路探索などの、グラフ理論に基づく演算。
アドバイスがある方がいましたら、@ts_3156に教えてもらえると助かります…!
GraphDBの苦手な分野
※この部分はまだ書きかけ
グラフ全体から検索したり、グラフのエッジを利用しない場合。
アドバイスがある方がいましたら、@ts_3156に教えてもらえると助かります…!
使うDBの種類によらず、結局問題になること
※この部分はまだ書きかけ
各種DBは、データの保存と取り出しを高速に行う仕組みを提供する。しかし、どういうDBを使っていようと、各種演算を行うためには一度データをメモリにのせる必要がある。
フォロー・フォロワーが多すぎるユーザのデータは、メモリにのせた時点でエラーがおきる。このエラーは、1つのオブジェクトに割り当てられるメモリ量や、各種プログラミング言語が利用できるメモリ量等に依存する。JavaだとOutOfMemory等が起きる。
大規模なデータを扱う上では、上記のような各種プログラミング言語の仕様依存のエラーにも対処する必要がある。
アドバイスがある方がいましたら、@ts_3156に教えてもらえると助かります…!