2009-06-04 1 views
6

ハッカーニュース(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分ごとに)、負荷を制限することもできます。

これらのショートカットを使用すると負荷が許容される可能性がありますが、スケールを改善できるより洗練されたソリューションを使用することをお勧めします。

これはどのように構造化しますか? :-)

答えて

0

これは私の考えです。まず、X列のトピックがsort_valueフィールドであるold_tableを作成します。

大量のUPDATE文を1つのテーブルで回避したいので、定期的に古いテーブルを新しく計算されたテーブルに置き換えます。私が知る限り、MySQLは "replace table"構文をサポートしていないので、毎分、cronを使用してnew_sort_valueというこのテーブルの更新版を作成します。それから私は、このコマンドのシーケンスやる:

  • DROP old_table
  • RENAME new_table
  • old_tableから

を、これは有効なアプローチのように見えるのか?

+0

少し不器用であれば有効だと思います。残念ながら、あなたはあなたが追加しているシステムの制約を扱っています。この種の問題を拡大することは、まさにrdbmsデータベースがうまくいかないことの1つです。 CouchDB Viewのようなものが、この路地のすぐ上にあります。 –

+0

ありがとう、ジェレミー。私はCouchDBをチェックアウトします。 私はこのアイデアをもう一度考えました。これは、 'table'がアクティブであることを示す値を(別の場所で)保存することです。現在の値は 'old_table'と言ってください。これは私のアプリに 'old_table'に対してJOINを行うように指示します。次に、更新された 'new_table'を作成した後、' new_table'に ''アクティブデータベース ''の値を更新します。 これは、通常のJOINに対して要求されているテーブルのDROPを回避します。 – bobbyh

1

これにはいくつかのトレードオフがあります。あなたはすでにあなたの質問にそれらを示唆しています。適時性と正確さと負荷と規模。

適時性と正確性が不要でシステムの負荷が大きい場合は、負荷を減らしてスケールを大きくする最も良い方法です。

実際にシステムの使用状況を調べて、最適化する必要がある領域を特定する必要があります。書き込みの最適化には、読み取りの最適化とは異なる制約があります。データの適時性または完全性と同じです。

アプリケーションにとって最も重要なものを特定し、適切なトレードオフを行います。

関連する問題