我可以在数据库多对多字段中使用计数器来减少查找吗?

Can I use a counter in a database Many-to-Many field to reduce lookups?

我正在尝试找出访问存储在联结对象中的数据的最快方法。下面的示例与我的问题类似,但上下文不同,因为我正在处理的实际数据集的关系有些不直观。

我们有 3 个 class:UserProductRating。 User 与 Product 具有多对多关系,其中 Rating 作为连接点/'through' class.

Rating 对象存储了几个问题的答案,这些问题是 1-5 级的整数评分(示例问题:[=11= 的质量如何],Product 的价值如何ProductProduct 的人性化程度如何)。为简化起见,假设他们每 Product 购买一次 User 费率。

下面是我要执行的计算:对于 User,计算他们购买的所有 Product 的平均评分(即所有其他 Users,其中一个将来自这个 User 他们自己)。然后我们可以告诉用户"On average, you buy products rated 3/5 for value by all customers who bought that product".

简单而缓慢的方法就是遍历用户的所有评论对象。如果我们假设每个用户都购买了少量 (<100) 的产品,并且每个产品都有 n 个评分,则 O(100n) = O(n)。

但是,我还可以执行以下操作:在 Product class 上,保留一个计数器,记录选择每个数字的 Rating 的数量(例如,有多少 User s 对该产品的价值评分为 3/5)。如果每次对 Product 进行评分时都增加该计数器,那么计算给定 Product 的平均值只需要检查每个 Rating 标准的 5 个计数器。

这是一种有效的技术吗?它通常 employed/is 有名字吗?这对我来说似乎很直观,但我对数据库的了解还不够,无法判断是否存在一些基本缺陷。

这是正常的。它最终是缓存:对状态进行冗余编码,以牺牲其他模式为代价使某些使用模式受益。当然也是复杂化了。

仅仅因为 RDBMS 数据结构是关系并不意味着您不能从一些简单的形式重新安排编码状态的方式。例如反规范化。

(有时冗余设计(包括像您这样的设计)被称为 "denormalized",因为它们实际上不是反规范化的结果,并且冗余不是反规范化导致或规范化删除的那种。事实上,可以合理地将您的情况描述为涉及规范化而不保留 FD(功能依赖性)。从 table 开始,用户的 id 和其他列,他们的 ratings (关系)及其counter. 然后 ratings 函数确定 counter 因为 counter = select count(*) from ratings. 分解为 user etc + counter, 即 table User, 和 user + ratings, 取消分组为 table Rating. )


Do you have a suggestion as to the best term to use when googling this

我经常评论:Google 你的 question/problem/goal/desiderata 许多清晰、简洁和具体的措辞,带有各种术语和标签的子集,因为你可能会发现它们有或没有你的具体名字(的variables/databases/tables/columns/constraints/etc)。例如 'when can i store a (sum OR total) redundantly in a database'。人类的措辞,而不仅仅是关键字,似乎有所帮助。您最好的选择可能是优化 SQL 数据库设计以提高性能。有整本书 ('amazon isbn'),一些在线 ('pdf')。 (但也许主要是重新查询)。研究与仓储相关的技术,因为 OLTP 数据库充当 OLAP 数据库的输入缓冲区,并使用 SQL 处理大数据。 (例如快照调度。)

PS 我称之为 "caching"(标签 也是如此)是(我的典型)相当抽象,以至于有严肃的笑话说 CS 中的一切正在缓存。 (谷歌搜索... "There are only two hard problems in Computer Science: cache invalidation and naming things."--Phil Karlton。)(欢迎大家。)