ハッカーニュース(http://news.ycombinator.com/)と同様に動作するbbPress(オープンソースフォーラムソフトウェア)へのプラグインをプログラミングしようとしています。ハッカーニュースのように並べ替える方法
具体的には、私は次のアルゴリズム使用してフォーラム・スレッド(bbPressは「トピック」それらを呼び出す)の順にソートしたい:
sort_value = (p - 1)/(t + 2)^1.5
where p = total votes for each topic from users
t = time since submission of each topic in hours
を私が使用して、この算出されたsort_valueによってトピックを並べ替えできるようにしたいと思いますMySQL。これは、空気中にアップしているが、私は、我々はなりますので、ユーザーによって個々の票を保存する別のテーブルがあるでしょう考えていた
topic_id bigint(20)
topic_start_time datetime
:
topics
テーブル内の関連するフィールドは次のようになりますユーザーが既に投票したかどうかを知ることができます。また、別のテーブルには、各トピックの現在の投票総数が格納されます。おそらく、そのテーブルに最新のsort_Valueを格納する別のフィールドがありますか?
正確にするには、の後にsort_valueをそれぞれの後に更新する必要があります。しかし、これは、特にすべてのトピックを更新しようとすると、データベースサーバーに負荷がかかりすぎる可能性があります。必要な場合は、トピックの最後のX#のsort_valueを計算するだけでデータセットを制限することができます。定期的にsort_valueを更新するだけで(たとえば、cronジョブを介して5分ごとに)、負荷を制限することもできます。
これらのショートカットを使用すると負荷が許容される可能性がありますが、スケールを改善できるより洗練されたソリューションを使用することをお勧めします。
これはどのように構造化しますか? :-)
少し不器用であれば有効だと思います。残念ながら、あなたはあなたが追加しているシステムの制約を扱っています。この種の問題を拡大することは、まさにrdbmsデータベースがうまくいかないことの1つです。 CouchDB Viewのようなものが、この路地のすぐ上にあります。 –
ありがとう、ジェレミー。私はCouchDBをチェックアウトします。 私はこのアイデアをもう一度考えました。これは、 'table'がアクティブであることを示す値を(別の場所で)保存することです。現在の値は 'old_table'と言ってください。これは私のアプリに 'old_table'に対してJOINを行うように指示します。次に、更新された 'new_table'を作成した後、' new_table'に ''アクティブデータベース ''の値を更新します。 これは、通常のJOINに対して要求されているテーブルのDROPを回避します。 – bobbyh