可能有一些资源可以为此提供参数,但您可能应该确切地决定您想要什么,而不是使用一些预定义的模型。我建议您定义一些规则,哪些用户集应该是等效的,或者哪些应该相互超过(例如 10 0 业力用户 = 1 5k 业力用户)(等效性更容易使用),这将很快为某些用户生成参数选择的方程。
使用对数(如前所述),一些(分数)幂(如平方根)甚至只是线性的都可以工作。
我建议类似newKarma = a.karma^b + c
, 解决起来应该不难a
,b
和c
. 我建议你选择b
而不是试图计算它。使用新用户(karma = 0)应该很容易解决这个问题。猜测值以接近您想要的值可能比数学确定它们更容易(因为一些规则一起不适合任何简单的方程)。
请注意,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
更快的选择是在插入/更新时计算派生业力,方法是增加一列并使用触发器,或者只是在调用插入/更新之前计算,然后使用新值调用插入/更新。