我有一个非常有趣的任务。但我不知道如何一言以蔽之,以便搜索相关主题。即使这个主题标题也可能无法反映我的需要。所以,如果有人有更好的标题 - 欢迎。
我会试着解释我的问题。
我在 MySQL 数据库表中有大约 100,000 行。我需要“比较”表中的条目。
“比较”并不意味着相等。有计算比较级别的算法。我有每个表格列的权重系数。意味着如果 entry#1 的 column1 等于 entry#2 的 column2,那么我给这对给出 5 个点。每列依此类推。
最直接的方法是为每对条目应用计算规则。我为什么害怕这个?100,000 个条目意味着大约 50 亿次“比较”操作。当然,我可以按需计算并将结果存储在缓存中的某处。但我相信最明显的方法并不是最有效的。
所以,我的第一个问题是:除了蛮力,还有其他更好的方法来实现我的目标吗?
我的第二个问题与更适合计算的工具有关。
- 应用程序语言是 PHP。因此,我需要将整个表加载到内存中并迭代数据。
- 在 MySQL 中创建存储过程。
- 使用 MongoDB 的聚合框架或 MapReduce。
我最不喜欢第一种方式。最重要的是 - 最后一个。
我正在寻找在这种情况下有经验的人的任何建议或建议。
因为,我不知道如何向谷歌寻求帮助,任何链接将不胜感激。
更新:
计算规则比我描述的要复杂一些......
表有一组相关的列,这些列将作为组一次使用(不是一个接一个)。让我们假设:
table
有字段,比如说,tag_1
, tag_2
, .., tag_n
.
row_1
和row_2
- 中的条目table
。
规则(伪代码):
if(row_1.tag_1==row_2.tag_1)
{
// gives 10 points
}
elseif(row_1.tag_1 is in row_2.tags && row_1.tag_1!=row_2.tag_1)
{
// gives 5 points
}
....
// and so on
基本上,我需要检查两个数组的交集。如果它不是空的 - 给出分数。如果两行中标签的索引匹配,则给出附加点。
我想知道,如何使用存储过程语言来实现这一点?因为使用任何编程语言都可以很容易地完成它。
如果存储过程可以做到这一点,那么这是我的选择。