减少MySQL中存储数据的冗余

时间:2010-12-07 22:40:19

标签: mysql storage

我觉得这已经得到了解答,但我不知道所涉及的正确术语,在搜索中找不到任何内容。

我正在研究产品推荐系统。我有一个项目数据库,我正在运行并确定哪些项目是相似的。例如,ItemID 1类似于5,7和8.问题是数据是多余的。当我遍历整个项目集时,我将结束这样的事情:

1 5,7,8
5 7,8,1
7 8,5,1
8 5,1,7

在MySQL中存储它的最佳方法是什么,所以我可以查询它并查找与1,5,7或8相关的项目。在现实生活中,每组中的项目数量不均匀。我关心的是速度而不是存储空间,但似乎应该有一个快乐的媒介,或者如果我很幸运,那么速度快,节省空间。

3 个答案:

答案 0 :(得分:1)

而不是项目的一列和另一列相似的列表,这导致每个项目在表格中有一行,考虑将每个(源,目的地)对存储在一个单独的行中。

而不是(1,{5,7,8}),(5,{7,8,1})你会得到(1,5),(1,7),(1,8),( 5,7),(5,8),(5,1)。然后,要查看哪些项目与项目8类似,您只需选择目标= 8的源。

答案 1 :(得分:1)

这称为“图形数据结构”。数字(1,5,7,8)是节点。每个连接(1-5,1-7,1-8,5-7等)都是边缘。

http://en.wikipedia.org/wiki/Graph_(data_structure

在MySQL中,您应该将边缘存储为每行一条边。如果每条边沿两个方向连接,则应在两个方向上添加每条边(即1-5和5-1)。我会设置这样的表:

TABLE edges (
  id PRIMARY KEY AUTO_INC,
  from INT,
  to INT
)

你需要一个索引(从),或可能(从,到)取决于。要查找与您正在查看的对象相关的所有对象:

SELECT to FROM edges WHERE from = X;

可以对这个简单的模型进行很多改进,但这是一个开始。

编辑:可能其中一些列名是关键词。我的坏。

答案 2 :(得分:1)

克里斯在同一时间是对是错。他是正确的,因为它是一个“图形数据结构”,但没有提到他的方法会让你最终在几个子查询中找到图形。

请帮自己一个忙,看看Nested Set模特。您可能希望转到MySQL manual以开始使用。

此致