2017-03-19 6 views
10

のためのデザイン、私は4つのテーブルがあります:userspostscategoriescategories_mapデータベース

postscategory_id
categories_mapが私の目標は、キューを作ることですuser_idcategory_id

が含まれ、idtextを持っていますユーザーはプレビューできます。また、ユーザーは一部の投稿をスキップしたり、その中のテキストを編集することができます。ユーザーが投稿をスキップした場合、投稿には表示されません。ただし、cronはスクリプトを実行するため、ユーザーはシーケンスを変更できません。

私が考える最初のアプローチは user_idpost_idtext_modifiedis_skippedlast_postedが含まれていますテーブルを作成することです。だから、cronジョブが実行されるとタイムスタンプが残ってしまい、次回はこの投稿は取得されず、ユーザーはこの投稿のテキストを簡単に変更することができます。

2番目の方法は、ユーザuser_idpost_idcategory_idtext_modifiedのキューが生成される別のテーブルを作成することです。だから、cronの仕事は簡単にこのテーブルに従って行を終えた後に行を削除することができます。しかし、このアプローチでは、30人のユーザーがいて、平均で3つのカテゴリにそれぞれ5000のポストが含まれていると、私のテーブルにはすでに450000の行があります。はい、それが正しくインデックスされていれば、それはすべて良いものでなければなりません。しかし、100〜200人のユーザーがいる場合はスケーラビリティがありますか?

私はどちらの方法をとるべきですか、それとも他の解決策がありますか?

答えて

6

多くのものは、製品によって異なります。私たちは分かりません:

  1. どのようにユーザーが相互に作用していますか?
  2. 彼らの行動(スキップ)は永続化する必要がありますか、または99.9パーセンタイルを超えて失われても問題ありません。
  3. 投稿に対するテキストの変更は、グローバルに表示されるのか、または表示のみに制限されますか。
  4. ユーザーはカテゴリ別に投稿をチェックしていますか? 4の質問への答えは、YESであれば、オプション#2は、より多くの音があなたのPKから判断すると思われる

は、これらすべての未知数言った、私はそれで刺してみましょう。

  • 質問4の回答がである場合、の場合、オプション1は、あなたのPKから判断するとより健全なようです。
  • データベースサイズについては、あらかじめ最適化を行っていると思います。テーブルの幅を考慮する必要があります。あなたのテーブルは非常に狭い(2つの列と主にint)ので、特定のテーブルの長さについてあまり心配しないでください。

    これが制約になる(ベンチマークできる、または特定のサーバー上のディスクスペースを待つ)場合、ユーザーを簡単にシャーディングすることによってデータベースをスケールアップすることができます。基本的には、異なるユーザーを異なるDBサーバーに配置します。

    • 注:質問1は、上記のように簡単にと判断します。リストは本当に長い得ようとしている

    は、すべてこれは、心のパフォーマンスに影響してくださいと述べました。

  • ユーザーの変更が他のユーザーに影響を及ぼす場合は、更新を特定のキューに公開するためにかなりのファンアウト作業を行う必要があります。
  • この場合、Memcached、Redisのような分散キャッシュを見てみるとよいでしょう。

    • 注:質問2 & 3への回答に応じて、あなたも、キューを永続化する必要はないかもしれません。
    +0

    1.ユーザーは互いに対話しません。2.この投稿をスキップした後。それはもはや彼らのために表示されません3.テキストの変更は、彼らの "壁"(ページ)4にのみ表示されます。彼らは彼らのために掲示されたものだけをチェックしています。 |キューを維持する必要がない場合は、どのように私は投稿を引っ張っているでしょうか? – user256968

    +0

    この場合、あなたの質問は典型的なタイムライン/ニュースフィードの問題です。警告では、ユーザーは壁紙を編集する必要があります(グローバル投稿とは別に)。上記の私の提案に従うことができます。 dbをシャーディングするのは簡単なはずです。 –

    +0

    私は自分の質問を正しくしなかったと思います。私はタイムライン/ニュースフィードを気にしない。私はcronのためだけにこのキューが必要です。このキューはユーザーにとって何も反映されません。例として、ユーザーは3つのカテゴリをチェックしました。合計で、それはキュー内の100の投稿か何でもあります。 Cronが最初に選択して、別のAPIにいくつかの呼び出しを行います。だからそれはちょうどキューに残って99となります。うまくいけば、私はそれをより明確にした – user256968