2016-04-27 3 views
0

私はsoundcloudのような同じフォロワーシステムを持つソーシャルアンドロイドアプリケーションに取り組んでいます。

私はそれがMySQLの、フォロワーと彼はデータベース設計 - 数十億レコードのシステムに従います

follower_id following_id 
1    2 
4    1 
6    2 
9    6 
.    . 
.    . 
.    . 

と主キーとして、両方のIDを使用し、その後1の両方を保持するフォローテーブルに次のように容易に実現できることを知っています。

しかし、問題はです。私たちは、ネットワークが何百万人ものユーザーに成長することを期待しています。

平均的にみると、全員が500人のフォロワーを持ち、500人のフォロワーを持つユーザーは100万人にすぎないと想像してください。

これは約1,000 * 1,000,000 = 1,000,000,000レコードのテーブルになり、それは成長し続けます!

はこのような状況でうまく動作しますか?

私はMongoDBの使用し、ここでこの

user_id  followers         following 
1   [embedded documents holding followers]  [embedded documents holding following] 
2   [embedded documents holding followers]  [embedded documents holding following] 
3   [embedded documents holding followers]  [embedded documents holding following] 
... 

問題のようにそれを保存し、パフォーマンスではありませんでした - 私は思うよう - しかし、モンゴがトランザクションをサポートしていないことになります理由私はそれを2つの文書に保存する必要があります。

だから、これを行うにはどうすればよいと思いますか?テーブルが何十億もの行になると、MySQLはうまく動作しますか?他の効率的なデザインはありますか?

+1

MySQLは、このような状況でも実行するかどうあなたが尋ねます。あなたのMySQLモデルがあなたのデータセットに対処するのに苦労している時点では、専門家の助けを借りて、または気を配りすぎるような問題を簡単に修正することができます。 – Strawberry

+1

なぜ、異なるソフトウェアをハードウェアに張り付けると、それが異なるのですか?これは、私たちの宇宙、つまりそのITがどのように機能するかではありません。あなたが悪いハードウェア、遅いディスク、恐ろしいネットワークを持っている場合 - ソフトウェアの量はそれを修正することはできません。高速のハードウェア、高速のディスク、十分なRAMを搭載している場合は、すべてのソフトウェアが動作します。何十億もの記録はコンピュータのためのものではありません。あなたはここで間違っていることを心配しています。データモデルでmin-maxingするのではなく、MongoDBを考えるのではなく、これに適切なハードウェアを割り当てることです。 MongoDBは魔法のことをしません。 – Mjh

+0

十億の行はあまり多くありません(特に、2つの4バイトのintのタプルの場合)。 – AndySavage

答えて

0
CREATE TABLE Follow (
    er_id INT UNSIGNED NOT NULL COMMENT 'follower', 
    ee_id INT UNSIGNED NOT NULL COMMENT 'followee', 
    PRIMARY KEY(er_id, ee_id), 
    INDEX(ee_id, er_id) 
) ENGINE=InnoDB; 

そのように、あなたはその逆をEEするerから得ることができます。

MySQLのテーブル構造と10億行と500フォロワーの場合、SELECT er_id FROM tbl WHERE ee_id = 1234;(またはその逆)は、回転するドライブでも通常わずか10-20ミリ秒かかります。

follower_idfollowee_idの同一性は、列名を短くするために私を導いた。)

関連する問題