我正在创建一个应用程序,用户可以通过多种方式获得“积分”。其中一些积分是因为他们的个人资料,他们采取的行动等等(即分布在多个表格中)。
我不希望在某些操作发生时在字段中手动添加点,因为我想确保数字一致性。我希望有一些计算字段,可以在一个字段中更新它们的点以便于查询。这是因为每次我想列出一组用户及其点(如前100名列表)时,我不想运行一个非常复杂的选择/视图。
有没有办法使用复杂的select语句在多个其他表中计算users表中的字段?它有效吗?我应该抛弃计算字段并使用写得很好的程序吗?
答案 0 :(得分:2)
如果它在多个表中传播,我建议使用这些表或用户定义的表/标量(取决于您的要求)函数来检索这些值。
答案 1 :(得分: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
根据您的架构和数据分布,还有很多其他方法,因此您必须尝试并跟踪您的效果。
答案 2 :(得分:0)
为什么不将积分细节保存在一张表中?表格中的行可能类似于UserId,Item和Points - 因此给定的用户可以有多个行,每个点都有不同的点,并且您可以轻松地将总数相加以用于报告目的。
关于确保数字一致性的问题,您可以在事务中进行调整。使用一组管理数据访问的存储过程很容易管理。例如,您在其配置文件中提到了5点存在某些数据 - 因此,当该数据添加到其配置文件中时,在同一事务中,您可以将新行插入Points表中。
否则,如果您尝试使用多个联接来管理此类,并且如果您需要经常报告这些数字,则可能非常慢,非常快。