就成本和可扩展性而言,提取大量数据的统计数据的最有效方法是什么?
让我们举一个具体的例子,有 1000 家公司,每家公司都有 10000 多个客户。这些公司都是零售的,或者让我们让它更通用,他们是任何行业的任何公司,他们想从他们的客户那里了解某些事情。
这些公司中有 10 家想知道他们的呼叫中心的表现如何,并发送一封电子邮件,要求客户给他们打分 1 - 5,客户点击链接并给他们打分 1 - 5。
这些公司中有 20 家(可能包括前 10 家中的一些)想要了解其他信息并要求评分为 1 - 5。
现在,如果我想向这些公司中的每一个提供关于其平均评分的反馈,或者它们与发送相同问卷或有重叠问题的其他公司相比在哪里堆积,那么计算这些统计数据的最佳策略是什么?
选项 1:有一个仅用于统计的特殊实体,每次客户对公司进行某项评价时,增加统计计数器(例如,增加投票数的统计计数器,投票总数,如果您根据以下条件跟踪投票,则增加男性/女性计数器性别等)这种方法的问题是,您将为每个数据条目执行 y 次额外写入(其中 n 是您要跟踪的统计报告的数量),然后您也仅限于这些统计你想跟踪的。此外,正如 Peter 在他的回复中提到的,您将被限制为 1 write/s:使用 Objectify 在 GAE 上同时写入数据 如果 x 是条目数,y 是您想要提取的统计报告的数量,您将正在执行 x * y 写入和 y 读取以报告统计信息。
选项2:执行以下操作: ofy.query(MyEntity.class).filter("field", v).count(); 陷阱在于您正在查找所有这些实体,如果您正在计算导致 x 个实体的计数,GAE 是否会为读取 x 操作收费?此外,如果您可能要运行 20000 个条目,您不会在超时、每个查询的最大读取数等方面达到某种限制吗?根据我提取统计数据的频率,这将意味着每次我提取统计数据时读取 x 次,假设我不会达到某些限制。
选项 3:在每个反馈条目中为您尝试构建的每条统计信息添加一个额外的属性。然后让调度程序每小时/每天/每周/ ...运行一次,使用游标运行每个条目,将统计列标记为已计数并将该值添加到统计实体。如果反馈条目的数量是 x 并且您想要提取 y 数量的关于此数据的报告,这意味着(假设您在内存中而不是立即在统计实体中进行计算)x 次写入以标记 x 反馈数报告为计数,并且 y 数字每小时/每天/每周写入一次以存储更新的统计值。这意味着对于 x 数量的反馈报告,我将至少进行 2 * x 次写入和仅 y 次读取来读取统计信息。
以上所有看起来都令人讨厌,有没有更好的方法呢?如果不是,那么上述哪种方法是更好的方法,当卷很大时不会中断,并且不会显着增加读取/写入/存储方面的成本。