2

目前,我正在处理一个电子商务项目的大型 mySQL 事务数据库。我们从电子商店获取数据,包括销售的产品。每个电子商店都添加有关产品之间相似性的信息并将它们列为。因此,例如商店 A 发送信息

  • 第 1 组:iPhone 蓝色、iPhone 黑色、iPhone 绿色
  • 第 2 组:iPad 蓝色、iPad 黑色、iPad 绿色等。

另一家网店发送此类信息:

  • 第 3 组:iPhone 粉色、iPhone 黑色
  • 第 4 组:iPad 蓝色、iPad 粉色

每个产品都存储在表Products中:(重要提示:该表大约有 150 000 000 行)

Id   | Name
------------------
1    | iPhone blue
2    | iPhone black
3    | iPhone green
4    | iPhone pink
5    | iPad blue
6    | iPad black
7    | iPad green
8    | iPad pink

此外,还有一个表Groups与上述组:(M:N 关系)

Id | Id_product   | Group
--------------------------
1  | 1            | 1
2  | 2            | 1
3  | 3            | 1
4  | 5            | 2
5  | 6            | 2
6  | 7            | 2
7  | 4            | 3
8  | 1            | 3
9  | 5            | 4
10 | 8            | 4

现在,问题是组 1 + 3 和组 2 + 4 应该合并在一起。

此问题的当前(可怕)解决方案是基于获取产品的所有组(通过查询中的 GROUP_CONCAT 函数),然后是这些组中的所有产品。然后更新表组以将这些组合并为一个。

这种方法的主要问题是:

  • 非常有问题的计算复杂性。
  • 从电子商店获得的组可能是错误的(!)。想象一下这个组:
    • 第 5 组:iPhone 黑色、iPad 黑色。考虑到这个群体,整个分离过程是错误的。您最终会得到一组同时使用 iPhone 和 iPad(这是错误的)。

所以,现在,最后,问题是: 任何想法如何解决这个问题?只是提示/提示就足够了,我只是完全缺乏我的知识。

我在玩模糊散列算法/k-means 聚类,但在我看来它不适合这个问题。模糊散列似乎正在考虑产品的名称(这可以用 iPhone 很好,但不能用 T 恤成像,它们的名称不是很“准备好”,所以很难从姓名)。我错过了什么吗?

那么,有什么想法吗?

无论如何,只是为了解决这个特定的问题,可以引入不同的数据库解决方案,这没有问题。

提前致谢:)

奇梅尔达

4

1 回答 1

0

一个想法可能是添加一个表“group_conversion”,它将每个外部组号转换为您自己的组号。

在这种情况下,表格如下所示:

Group_external | NameMatch | ID_my_group
----------------------------------------
1              | null      | 1
2              | null      | 2
3              | null      | 1
4              | null      | 2
5              | "IPhone%" | 1
5              | "IPad%"   | 2

当插入来自电子商店的新数据时,您应该首先将传入的组编号转换为您自己的组编号,然后再将其添加到组表中。NameMatch 字段仅在您想在传入组(您提到的 Group5)中分隔产品时使用。所以如果该字段为空,只需转换ID即可。否则,仅当产品名称与 NameMatch 匹配时才转换 ID。

要转换您当前的数据,创建一个与 Groups 具有相同字段的新表(例如 Groups2)可能会有所帮助,唯一的区别是 Group 是对新组编号的引用。然后,您可以通过转换组的每条记录来填充新表。转换完成后,删除 Groups 表并重命名 Groups2 表。

通过这种方式,您将获得更小的 Groups 表大小,并且该表已经包含合并数据,因此合并不需要单独的查询。

希望这会有所帮助!

于 2013-10-10T11:12:33.327 回答