大規模ソーシャルネットワークデータを扱う上での問題点、各種NOSQL DBの比較

後半部分がけっこう書きかけのままです…! 何かアドバイスがある方がいましたら、@ts_3156に教えてもらえると助かります…!


えごったーというアプリケーションを開発している都合上、大規模なソーシャルネットワークデータを扱う方法をよく考えています。


その過程で色々なDBを検討するので、その思考過程をまとめておきます。


私が、大規模ソーシャルネットワークデータを利用して実現したい機能は以下の通りです。


  1. フォロー・フォロワーがそれぞれ約8000人規模(もっと多いこともある)の複数のユーザ、の共通のフォロー・フォロワーを見つける
  2. あるユーザからの距離がn以下であるユーザ一覧を見つける

「このページの情報間違っているよ。」という方がいましたら、遠慮なく@ts_3156までご連絡ください…!


NOSQLと従来のRDBMSのどちらを使うべきか


まず、MySQLに代表される従来のRDBMSは、ソーシャルネットワークデータを扱うことにあまり適していないらしいので、検討対象外とします。


ツイッターなんかはいまだにMySQLを使っているみたいですし、お金をかけてサーバをクラスタリングすれば、RDBMSでも大丈夫なんだろうとは思います。ただ、個人開発者にそんなお金はないので、以下このページでは、NOSQL(Not Only SQL)データベースに限って話を進めていきます。


従来のRDBMSでは何故駄目なのか(補足)


従来のRDBMSでは何故駄目なのか、具体例を使って一応説明しておきます。


なんで適していないのかあまりちゃんと理解していないんですが、たぶん以下のようなテーブルの結合演算にコストがかかりすぎるんだと思います。


コストがかかりすぎる例として、ツイッターのフォロー関係を挙げます。Aというユーザのフォロワー一覧を取得したい場合には、普通にいくと以下の手順が必要だと思います。


  1. Table1からAというユーザのデータを取得
  2. 取得したAのデータから、フォロワー一覧を取得するキーを作成
  3. フォロワー一覧取得キーを利用して、Table2からAのフォロワー一覧を取得する

この操作の中では、Table1とTable2のデータをそれぞれ取得して、結合する操作が必要になります。フォロワーが多くなると、Table1から取得するデータは1レコードなのに、Table2から取得するデータは数千レコード、ということになってしまいます。たぶんこのあたりがまずいんじゃないのかなー?(勘ですが)


NOSQLデータベースにはどんな種類があるのか


ざっくり大別すると、NOSQLには下記の4種類があります。


  1. キー/バリューストア(Key-Value-stores)
  2. BigTable実装
  3. ドキュメントストア(Document-stores)
  4. グラフデータベース(Graph Databases)

※上記の4分類はこのページより引用


上記の4分類は全部NOSQLデータベースの仲間です。実装方法の違いによって上記のように分類されています。


NOSQLの具体的な実装例


上記の4分類について、さらに具体的な実装例を以下にあげます。



各種NOSQL DBのメリット・デメリット


すごくざっくり言うと、各種NOSQL DBは、おおよそ以下のような特徴を持ちます。


  1. データの取得が高速
  2. データの(ディスクスペース的な意味での)保存効率が良い
  3. 開発途上でありまだ製品レベルではない

※あくまでもざっくりとした特徴です!


もっと詳しい説明は、以下のページを参考にしてください。とても詳しく解説してあります。


2010年6月15日の記事

InfoQ: グラフデータベース、NOSQL、Neo4j


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に教えてもらえると助かります…!


著者プロフィール
Webサイトをいくつか作っています。
著者プロフィール