目前,我正在处理一个电子商务项目的大型mySQL事务数据库。我们从电子商店获得数据,包括销售的产品。每个电子商店都会添加有关产品之间相似性的信息,并将它们作为组列出。例如,商店A发送信息:
第一组:iPhone蓝色、iPhone黑色、iPhone绿色
第二组:iPad蓝色、iPad黑色、iPad绿色等。
另一家电子商店发送此类信息:
第三组:iPhone粉色,iPhone黑色
第四组:iPad蓝色,iPad粉色
每个产品都存储在表Products中:(重要:此表有大约15000000行)
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
此外,还有一个表组,其组如上所述:(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函数),然后从这些组中获取所有产品。然后更新表组以将这些组合并为一个组。
这种方法的主要问题是:
非常有问题的计算复杂性。
从电子商店获得的组可能是错误的(!)。想象一下这个群体:
第五组:iPhone黑色,iPad黑色。考虑到这个群体,整个分离过程是错误的。你最终会和一组iphone和ipad在一起(这是错误的)。
所以,现在,最后一个问题是:
有什么办法解决这个问题吗?仅仅是暗示/提示就足够了,我只是完全陷入了知识的匮乏。
我在玩模糊散列算法/k-means聚类,但在我看来它不适合这个问题。模糊散列似乎正在考虑产品的名称(这在iPhone上可能很好,但不能用T恤来表示,它们的名称不是很“准备充分”,因此很难仅仅从名称中猜出差异)。我遗漏了什么吗?
那么,知道吗?
总之,为了解决这个特殊的问题,可以引入不同的数据库解决方案,这是没有问题的。
提前谢谢:)
奇梅尔达
最佳答案
一个想法可能是添加一个表“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
在插入来自电子商店的新数据时,应首先将传入的组号转换为自己的组号,然后再将其添加到组表中。
仅当要将传入组(您提到的组5)中的产品分开时,才使用NameMatch字段。
因此,如果该字段为空,只需转换ID。否则,仅当产品名称与NameMatch匹配时才转换ID。
要转换当前数据,创建一个与组具有相同字段的新表(例如Groups2)可能会有所帮助,唯一不同的是该组是对新组编号的引用。
然后,可以通过转换组的每条记录来填充新表。
转换完成后,删除Groups表并重命名Groups2表。
这样,您将得到一个更小的组表大小,并且表已经包含合并的数据,因此合并不需要单独的查询。
希望这会有帮助!
关于mysql - mySQL数据库:分离/集群(?)数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19291332/