减少MySQL中存储的数据冗余
我有一种感觉,这已经得到了回答,但我不知道正确的术语,在我的搜索中找不到任何东西 我在做一个产品推荐系统。我有一个项目数据库,我正在浏览并确定哪些项目是相似的。例如,itemid1类似于5、7和8。问题在于数据是冗余的。当我在整个项目集合中循环时,我会得到如下结果: 1 5,7,8减少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相关的项。在现实生活中,每套物品的数量会参差不齐。我关心的是速度,而不是存储空间,但似
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层类别来说,它肯定更快。在此之前,它还需要一定程度的维护以确保树的安全。我喜欢这篇文章,它提供了一个更真实的例子,或者介绍了您如何/为什么使用这个解决方案。