【问题标题】:Reducing redundancy in data for storage in MySQL减少存储在 MySQL 中的数据冗余
【发布时间】:2010-12-07 22:40:18
【问题描述】:

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

我正在开发一个产品推荐系统。我有一个项目数据库,我正在运行并确定哪些项目是相似的。例如,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 相关的项目。在现实生活中,每个集合中的项目数量是奇数.我更关心速度而不是存储空间,但似乎应该有一种快乐的媒介,或者如果我幸运的话,它速度快,而且节省空间。

【问题讨论】:

    标签: mysql storage


    【解决方案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
    )
    

    您将需要一个关于 (from) 或可能 (from, to) 的索引,具体取决于。要查找与您正在查看的对象相关的所有对象:

    SELECT to FROM edges WHERE from = X;
    

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

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

    【讨论】:

      【解决方案2】:

      考虑将每个(源、目标)对存储在单独的行中,而不是一列用于项目,另一列用于相似内容列表,这会导致每个项目在表中占一行。

      您将使用 (1, 5), (1, 7), (1, 8), ( 5, 7), (5, 8), (5, 1)。然后要查看哪些项目与项目 8 相似,您只需选择 source where destination=8。

      【讨论】:

        【解决方案3】:

        克里斯既是对又是错。他是对的,它是一个“图数据结构”,但没有提到他的方法会让你最终在几个子查询中找到一个图。

        请帮自己一个忙,看看Nested Set 模型。您可能想前往MySQL manual 开始使用。

        问候

        【讨论】:

        • 这是一个灵活的解决方案,但我不知道它是否适用于只需要一层嵌套,就像我从这篇文章中收集到的那样。不过,获得 n 层类别肯定更快。以前这样做过,它还需要一定程度的维护来确保树的安全。我喜欢 this 文章,因为它可能是一个更真实的例子,或者你如何/为什么使用这个解决方案。
        猜你喜欢
        • 2014-08-28
        • 1970-01-01
        • 1970-01-01
        • 2019-06-20
        • 1970-01-01
        • 2020-11-05
        • 1970-01-01
        • 2012-03-31
        • 1970-01-01
        相关资源
        最近更新 更多