2012-05-08 2 views
0

私が作成しようとしているのは、ユーザーをフォローするのではなく、共有するコンテンツのセクションに従うフォロー/フォローシステムです。ほとんどの場合、あなたはTwitterの "リスト"やグループではなく、人々を追跡しているようです。しかし、これで、ユーザーが共有しているすべてのものをフォロー/アンフォローできますし、必要なリストをフォロー/アンフォローすることもできます。グループまたはリストのデータベーススキーマのフォロー/フォロー解除

例#1:私はユーザ#1のリストに従うが、政治について1をアンフォローするボタン「すべてをたどる」をクリックしてください。今私は彼らが1つのリストを除いて共有しているもののすべてに従っています。私は彼らの信者です。

例#2:は私の代わりに「すべてをたどる」ボタンをクリックするだけで1ユーザ#の2のリストに従ってください。私は1つのリストだけを見るべきであり、リストのすべてを見るべきではありません。

シンプルなフォロー/フォローシステムの構造は、user_id => follower_idスキーマのテーブルである可能性がありますが、それはユーザーが作成する新しいリストを考慮しません。

質問:これに最も適したデータベーススキーマは何ですか?

+1

ここでは、基本的なリンケージテーブルに加えて、follower =>を保存するメタシステムが必要です。パブリッシュ/サブスクライバ設定。これは、フォロワー=>パブリッシャーを格納することができます。パブリッシャが新しいリストを追加すると、そのメタテーブルのフォロワセットにメッセージがブロードキャストされ、サブスクライブされているすべてのフォロワーの新しいローが作成されます。 – PorridgeBear

+0

@PorridgeBear私はそれについて考えましたが、もっと簡単な解決策が必要なようです... – stwhite

答えて

2

それを簡略化するために、スケールそれを助けるために、私はuser_id => follower_id

のマッピングであるヘルパーテーブルとlist_id => follower_idのマッピングと考えるでしょうヘルパー表は、あなたが知っているだろう唯一のことは、ということですユーザーが新しいリストを作成した場合は、作成する必要があるマッピングが何かを示します(list_id => follower_id)。基本的には、フォロワーのための設定として機能します。 (例:Xユーザーの新しいリストに自動的に従います)

フィードをフォロワーに表示しているときは、マップlist_id => follower_idを持つテーブルにのみアクセスします。 user_id => follower_idマッピングを参照する必要はありません。それは、新しいリストが作成されたときにのみ再生されるようになります。

ここで最大の問題は、フォロワーが「フォローすべて」/「フォローユーザー」と初めて言うケースを処理する必要があることです。この場合、list_id => follower_idマッピングのすべてを、そのユーザーに既に存在するリストに基づいて埋め戻します。 (私はこれがTwitterの次のモデルを扱う方法と似ていると信じています。もし誰かがフォローし始めると、X個のツイートがバックフィルされ、フォローしないと最新のツイートがX個取り除かれます)

ユーザーがリストを除外したい場合は、その特定のリストのマッピングをそのフォロワーに削除するだけです。この場合、user_id => follower_idのマッピングを残すことができます。これは、ユーザーがフォロワーに表示するために作成した新しいリストが必要だと仮定しているからです。

+1

フォロワーとしてカウントしたい場合は、フォロワーがフォロワーの後ろにあれば 'user_id => follower_id'を存在させることができますauto_followは、ユーザーが作成した新しいリストを自動的にフォローしたい場合にtrueまたはfalseと表示されます。その後、ユーザーが新しいリストを作成すると、auto_followをtrueに設定したすべてのフォロワーを検索し、その時点で 'list_id => follower_id'マッピングを挿入します。 – peteynorge

+0

それはちょうど怪物サイズのテーブルになるのだろうか? 10万人のユーザーが10個のピース​​をリストしていて、100人の平均をたどっていても、1トンの行があるようです。 – stwhite

+0

ええ、それは大量のデータになる可能性がありますが、ストレージは安いです.100Kのアクティブユーザーがいる場合は、より多くのストレージを購入するための資金を得ることができます:)このデザインの最も重要な部分は、それはあなたがより多くのデータを格納することを意味します。このアプローチの良い点は、基本的に1人のユーザーが100万人のユーザーと同じ速さで読み込みができ、スキーマがシンプルであることです。いずれにせよ、これが助けてくれることを願う。私は他のアイデアがありません。当社の製品では、同様のフォローの戦略を使用しますが、非リレーショナルデータベースを使用しているため、MySQLに正確には適用されない可能性があります。 – peteynorge

関連する問題