【发布时间】:2017-08-28 13:06:55
【问题描述】:
我是 sql & php 新手,不确定在这种情况下如何进行:
我创建了一个带有两个表的 mysql 数据库。 一个只是包含数据的用户列表,每个用户都有一个唯一的 ID。 第二个是给用户奖励一定数量的积分,相关的列是用户id和奖励积分的数量。该表应该定期获取新条目,并且单个用户可以在其中出现的次数没有限制。
在我的 php 页面上,我现在想显示按总点数排序的用户列表。
我的第一种方法是在用户表中创建一个“points_total”列,旨在运行某种查询,每次将新条目添加到另一个表时,该查询将为每个用户计算和更新正确的总数。为了检索数据,我可以使用非常简单的查询,甚至使用 sql 的排序功能。
但是,虽然使用 sum where 函数可以轻松更新特定用户的总数,但我看不到为整个用户表执行此操作的方法。毕竟,纯 sql 不提供迭代表的每一行的能力,还是我错过了不同的方式? 我可能可以通过检查 php 中的表来进行更新,但是我不确定这是否是一个好的方法,因为在某种程度上存储点数据两次(一个表中的总数然后在不同的表中使用一些附加信息进行点分解)似乎是多余的。
另一种选择是放弃额外的列,而是在每次访问 php 页面时计算总和,然后使用 php.ini 进行排序。但是,我想这会比在数据库中准备好数据要慢得多,如果表有很多条目,这可能是个问题?
我有点迷路了,所以任何建议都将不胜感激。
【问题讨论】:
-
您当然可以使用 SQL 来执行此操作。决定性因素可能是被查询的数据量。
-
由于这将是一个累积列,是否可以插入日期较早的行?如果是这样,在运行时计算,或查看数据仓库
-
您可以构建一个提供总计的简单 SQL 查询,而不是在用户中存储和维护总计字段。除非您期望记录的数量非常多,否则此方法可能对您有用。如果您期望有很多记录,即。数百万,然后在点表上设置触发器(插入和更新)以更新用户记录将起作用。如果更新积分记录,就会出现复杂情况。您需要减去原始记录中的点并添加新记录中的点。
-
@mkaatman 这是一个
database-design问题,因此它肯定会有一些主观性。如果在 SO 中允许database-design标志,那么也应该允许这样的问题。 -
@mkaatman,我同意 Giorgos Altanis 的观点。存在一些主观性,但这是关于两种可能的方法以及如何实施的问题。
标签: php mysql sql database-design