在成本和可扩展性方面,最有效的方法是在大量数据上提取统计数据?
让我们举一个具体的例子,有1000家公司,每家公司都有10000多名客户。 这些公司都是零售公司,或者让它更具通用性,它们是任何行业中的任何公司,他们想要了解客户的某些事情。
其中10家公司想知道他们的呼叫中心的表现如何,并发出一封电子邮件,要求客户给他们评分1 - 5,客户点击链接并给他们评分1 - 5. 其中20家公司,其中可能包括前10家公司中的一些公司,希望了解其他事项,并要求获得1 - 5的评级。现在,如果我想向这些公司提供有关其平均评级的反馈,或者他们与发送相同问卷或重叠问题的其他公司相比,那么计算这些统计数据的最佳策略是什么?
选项1:只为统计数据设置一个特殊实体,每次客户对公司进行评级时,增加统计数据计数器(例如,增加统计数据计数器的投票数,投票总数,增加男性/女性计数器,如果您正在跟踪基于性别的投票等) 这种方法的问题在于,您将为每个数据条目执行大量额外写入(其中n是您要跟踪的统计信息报告的数量),然后您还将限制为您想要的那些统计信息。跟踪。此外,正如彼得在回答中提到的那样,你将被限制为1次写入:Using Objectify to concurrently write data on 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次数来读取统计数据。
以上所有看起来都很难吃,有没有更好的方法呢? 如果没有,上面哪一个是更好的方法,当卷量巨大时不会破坏,并且不会显着增加成本,而不是读取/写入/存储的成本。