我们有一个由数据库(目前是Oracle,计划支持MS SQL Server)支持的产品,有几十个表。为简单起见,我们选择一个名为TASK的表。
当我们需要向用户显示具有特定条件的任务数量时,我们有一个用例。例如,假设在TASK表的许多列中,有3列适用于此用例:
因此,我们希望向用户显示究竟有多少任务是LOW,MEDIUM,HIGH,一些特定用户拥有多少任务,以及有多少属于不同状态。当然,基本的实现是在TASK表的每次修改时保持这些计数是最新的。然而,使问题复杂化的事实是用户可以另外通过可以包括(或不包括)上述列的一部分的一些标准来过滤结果。
例如,用户可能希望仅查看由他拥有且上个月创建的任务的计数。这里可能的过滤器组合数量是无穷无尽的,所以不用说维持最新的计数是不可能的。
所以问题是:如何在不严重影响数据库性能的情况下解决这个问题?可以单独通过数据库解决,还是应该使用其他数据存储,如稀疏数据商店?感觉就像许多公司中存在的问题一样。例如,在亚马逊商店中,您可以在使用任意文本搜索条件时查看类别的计数,这意味着他们也会在现场计算,而不是始终保持最新。
最后一件事:我们可以接受某个功能限制,说计数应该精确到100,但是从100开始它可以说"超过100个任务"。也许这种缓解可以让我们发出更有效的SQL查询。
谢谢!
答案 0 :(得分:0)
据我了解,您希望获得有关3种不同发行版的信息:PRIORITY,OWNER和STATUS。我想解决这个问题的最好方法是维护3个不同的数据源(比如SQL查询,DB或Redis中的聚合信息等)。
计算此数据的最简单方法我认为是为每个分发构建单独的SQL查询。例如,对于优先级,它会像:
SELECT USER_ID, PRIORITY, COUNT(*)
FROM TASKS
[WHERE <additional search criterias>]
GROUP BY PRIORITY
当然,就数据库性能而言,它不是最有效的方式,但它可以使计数保持最新。
如果您希望存储可能会显着减少数据库负载的聚合值(这取决于行数),那么您可能需要构建一个维度应该是可用搜索条件的多维数据集。使用这种方法,您可以实现限制功能。