2009-04-17 11 views

答えて

37

Twitterのようなソーシャルネットワーキングサイトの多くはないではありませんMessage Queueアプリケーションを除くRDBMSを使用してください。それらの多くは、RabbitMQのような既に存在するアプリケーションから始まります。それらのうちのいくつかは、大きくカスタマイズしたり、独自に構築したりする必要があります。 Twitterはこれを2回目の処理中です。

メッセージキューアプリケーションは、1つまたは複数の他のサービスの1つのサービスからのメッセージを保持することによって機能します。たとえば、サービスFrankがキューfooにメッセージを公開しているとします。 JoeとJillはFranks foo queueに登録されています。アプリケーションは、JoeまたはJillがメッセージを受信したかどうかを追跡し、キューに登録されたすべての加入者がメッセージを破棄したメッセージを受信すると、そのメッセージを追跡します。フランクはメッセージを発し、それについて忘れてしまった。 JoeとJillはfooからのメッセージを求め、まだ得られていないメッセージを取得します。ジョーとジルはメッセージで何をする必要があれば何でもします。たぶんそれはおそらくそうではないかもしれない。

メッセージキューアプリケーションでは、メッセージを取得する必要があるすべてのユーザーがメッセージを要求できます。出版社は、加入者が最終的にそれらを得ることができると確信するメッセージを送ることができます。これには完全に非同期で、コストのかかる結合を必要としないという利点があります。

編集:私はまた、通常、このような種類のものは大量に非正規化されていることに言及する必要があります。したがって、JoeとJillはまったく同じメッセージのコピーを格納している可能性があります。これは、アプリケーションが何十億というユーザーに拡大するのを助けるので、これは大丈夫だと考えられています。

その他の読書:

  1. http://www.rabbitmq.com/
  2. http://qpid.apache.org/
+1

1をこの上の偉大な記事を書いた、これではありません明らかに古いSQLのworに3NFは長年にわたり指導的な星であった。 (http://ja.wikipedia.org/wiki/Third_normal_form) – Crypth

0

users.friendsとusers.eventsの結合を行うと、クエリキャッシュがうまくいくかもしれませんが、友人やイベントが増えるにつれてかなり遅くなります。また、ユーザーがイベントを作成するたびに、エントリがジョイン・テーブルに作成されるたびに(「friends_events」と呼ばれる)イベントベースのモデルを試すこともできます。したがって、ユーザーが自分の友達が作成したイベントを見たいときはいつでも、自分のidとfriends_eventsテーブル間の結合を実行して見つけることができます。このようにして、友人とのすべてのユーザーをつかむことなく、友達とイベントテーブルを結ぶことを避けることができます。

7

ソーシャルネットワーキングサイトの主なデータ構造はgraphです。 Facebookでは、グラフは無向です(あなたが誰かの友人である場合、あなたは友人です)。ツイッターでグラフが指示されます(あなたは誰かに従っても、必ずしもあなたに従うわけではありません)。

グラフを表現する2つの一般的な方法は、adjacency listsadjacency matricesです。

隣接リストは、単にグラフ上のエッジのリストです。整数useridを持つユーザーを考えてみましょう。

User1, User2 
    1  2 
    1  3 
    2  3 

これらのレコードの無向解釈は、ユーザー1は、ユーザー自明であるデータベースのテーブルでこれを表現3.

と友達にユーザ2及び3とユーザ2と友達にされていることです。私たちがよく知っている多対多関係結合表です。特定のユーザーの友人を見つけるためのSQL照会は非常に簡単です。

特定のユーザーの友達がわかったので、その結果を更新テーブルに追加するだけで済みます。この表には、ユーザーIDで索引付けされたすべてのユーザーの更新が含まれています。

限り、これらすべてのテーブルが適切にインデックス化されているとして、あなたはあなたが興味を持っている質問に答えるために、効率的なクエリを設計するのはとても簡単時間を持っていると思います。

関連する問題