我觉得这已经得到了解答,但我不知道所涉及的正确术语,在搜索中找不到任何内容。
我正在研究产品推荐系统。我有一个项目数据库,我正在运行并确定哪些项目是相似的。例如,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相关的项目。在现实生活中,每组中的项目数量不均匀。我关心的是速度而不是存储空间,但似乎应该有一个快乐的媒介,或者如果我很幸运,那么速度快,节省空间。
答案 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以开始使用。
此致