このためのパラメーターを提供できるリソースがおそらくいくつかありますが、事前定義されたモデルを使用するのではなく、必要なものを正確に決定する必要があります。どのユーザーのセットが同等であるか、またはお互いを上回る必要があるかについて、いくつかのルールを定義することをお勧めします (例: 10 0 カルマ ユーザー = 1 5k カルマ ユーザー) (同等である方が作業がはるかに簡単です)。選ばれた方程式。
対数 (既に提案されているように) を使用すると、一部の (分数の) 累乗 (平方根など) または線形だけでも機能します。
のようなものを提案しますが、newKarma = a.karma^b + c
解決するのはそれほど難しくありません。計算するのではなく、選択することをお勧めします。新しいユーザー (カルマ = 0) を使用すると、これを非常に簡単に解決できるはずです。必要な値に近づけるために値を推測することは、数学的に決定するよりも簡単な場合があります (いくつかのルールを組み合わせると単純な方程式に適合しないため)。a
b
c
b
上記はカルマのオフセットであることに注意してくださいc
。これにより、多くの新規ユーザーは、カルマの高いユーザーよりもカルマの合計が多くなります。a.(karma + c)^b
、またはについても考えてみてa.(karma + c)^b + d
ください。定義したルールを分析すると、使用するルールがわかります。
更新:の代替案を追加c
編集: SQL にはいくつかのオプションがあります。一時テーブル (合計付き) が実際には最速かもしれません。ビューだけを使用することもできます。よくわかりませんが、同じテーブルでの結合も可能かもしれません。ビューを使用すると、次のようになります: (選択した a、b、c、および d の場合) (ビューにインデックスを追加することもできます)
Votes(issueID, userID) // table structure
User(userID, karma, ...) // table structure
CREATE VIEW Sums AS
SELECT issueID, SUM(1*POWER(karma + 2, 3) + 4) AS sumVal
FROM Votes JOIN User ON User.userID = Votes.userID
GROUP BY issueID
クエリ:
SELECT (1*POWER(karma + 2, 3) + 4)/sumVal AS influenceOnIssue
FROM Votes JOIN User ON User.userID = Votes.userID
JOIN Sums on Sums.issueID = Votes.issueID
WHERE Votes.userID = @UserID AND Votes.issueID = @IssueID
単純化は、次のような計算列を持つことです。1*POWER(karma + 2, 3) + 4
より高速なオプションは、追加の列を用意してトリガーを使用するか、挿入/更新を呼び出す前に計算し、新しい値で挿入/更新を呼び出すことにより、挿入/更新時に派生したカルマを計算することです。