0

我正在创建一个应用程序,用户可以通过多种不同方式获得“积分”。其中一些积分应计是由于他们的个人资料、他们采取的行动等而发生的(即分布在多个表格中)。

当发生某些操作时,我不想在字段中手动添加点,因为我想确保数字的一致性。我想要某种计算字段,以便在字段中更新他们的点以便于查询。这是因为我不想在每次想列出一组用户及其积分(如前 100 名列表)时都运行极其复杂的选择/视图。

有没有办法在多个其他表上使用复杂的 select 语句来计算 users 表中的字段?它有效率吗?我是否应该放弃计算场并使用编写良好的程序?

4

3 回答 3

2

如果它分布在多个表中,我会推荐一个视图,使用这些表或用户定义的表/标量(取决于您的要求)函数来检索这些值。

于 2009-12-05T11:47:16.980 回答
0

您的方法听起来很合理,通常我们需要在 SQL 设计投入生产并开始受到影响后对其进行反规范化。

有很多方法可以做到这一点。这是使用 T-SQL 执行此操作的一种方法:

SELECT
    u.Id,
    u.UserName,
    t.Point_Total
FROM User u
INNER JOIN (
     SELECT Id, SUM (Points) AS Point_Total
     FROM (
        SELECT Id, Points FROM TableA
        UNION ALL   --Be **SURE** to include "ALL"
        SELECT Id, Points FROM TableB
        UNION ALL
        SELECT Id, 5 AS Points FROM SpecialCondition
     GROUP BY Id
     ) t ON t.Id = u.Id

根据您的架构和数据分布,还有许多其他方法,因此您必须试验和跟踪您的性能。

于 2009-12-05T11:47:10.180 回答
0

为什么不将积分详细信息保存在一个表格中?表中的行可以是 UserId、Item 和 Points 之类的东西——因此给定的用户可以有多个行,每个行都有不同的点,您可以轻松地将总数相加以进行报告。

关于您对确保数字一致性的关注,您可以在事务中进行调整。使用管理数据访问的存储过程集合将很容易管理。例如,您提到他们的个人资料中存在某些数据的 5 分——因此,当将该数据添加到他们的个人资料中时,在同一个事务中,您将在 Points 表中插入一个新行。

否则,如果您尝试使用多个连接来管理这种类型,并且如果您需要经常报告数字,它可能会变得非常缓慢,非常快。

于 2009-12-05T12:06:44.807 回答