Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
减少MySQL中存储的数据冗余_Mysql_Storage - Fatal编程技术网

减少MySQL中存储的数据冗余

减少MySQL中存储的数据冗余,mysql,storage,Mysql,Storage,我有一种感觉,这已经得到了回答,但我不知道正确的术语,在我的搜索中找不到任何东西 我在做一个产品推荐系统。我有一个项目数据库,我正在浏览并确定哪些项目是相似的。例如,itemid1类似于5、7和8。问题在于数据是冗余的。当我在整个项目集合中循环时,我会得到如下结果: 1 5,7,8 57,8,1 7.8,5,1 8.5,1,7 在MySQL中存储这些内容的最佳方式是什么,这样我就可以查询它并找到与1、5、7或8相关的项。在现实生活中,每套物品的数量会参差不齐。我关心的是速度,而不是存储空间,但似

我有一种感觉,这已经得到了回答,但我不知道正确的术语,在我的搜索中找不到任何东西

我在做一个产品推荐系统。我有一个项目数据库,我正在浏览并确定哪些项目是相似的。例如,itemid1类似于5、7和8。问题在于数据是冗余的。当我在整个项目集合中循环时,我会得到如下结果:

1 5,7,8
57,8,1
7.8,5,1
8.5,1,7


在MySQL中存储这些内容的最佳方式是什么,这样我就可以查询它并找到与1、5、7或8相关的项。在现实生活中,每套物品的数量会参差不齐。我关心的是速度,而不是存储空间,但似乎应该有一个快乐的介质,或者如果我是幸运的一个,速度快,节省空间。

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

而不是(1,{5,7,8}),(5,{7,8,1}),你会有(1,5),(1,7),(1,8),(5,7),(5,8),(5,1)。然后,要查看哪些项目与项目8相似,只需选择source,其中destination=8。

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

)

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

TABLE edges (
  id PRIMARY KEY AUTO_INC,
  from INT,
  to INT
)
您将需要一个关于(from)的索引,或者可能需要一个(from,to)的索引,具体取决于。要查找与正在查看的对象相关的所有对象,请执行以下操作:

SELECT to FROM edges WHERE from = X;
这个简单的模型可以做很多改进,但这只是一个开始


编辑:也许其中一些列名是关键词。我的错。

克里斯是对的,也是错的。他是对的,因为它是一个“图形数据结构”,但没有提到他的方法会让您在几个子查询中找到一个图形

请帮个忙,看看这个模型。你可能想去医院开始工作


关于

这是一个灵活的解决方案,但我不知道它是否适用于只需要一个层次的嵌套,就像我从这篇文章中收集到的那样。不过,对于获得n层类别来说,它肯定更快。在此之前,它还需要一定程度的维护以确保树的安全。我喜欢这篇文章,它提供了一个更真实的例子,或者介绍了您如何/为什么使用这个解决方案。