目前我正在处理一个电子商务项目的大型mySQL事务数据库。我们从电子商店获得数据,包括销售的产品。每个电子商店都会添加有关产品之间相似性的信息,并将其列为组。因此,例如商店A发送信息:
另一家电子商店发送此类信息:
每个产品都存储在表产品中:(重要:此表有大约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
此外,还有一个表格群组,其中包含上述群组:(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函数),然后获取这些组中的所有产品。然后更新表组以将这些组合并为一个。
此方法的主要问题是:
所以,现在,最后,问题是: 任何想法如何解决这个问题?只是提示/提示就足够了,我只是完全陷入了缺乏知识的情况。
我正在玩模糊哈希算法/ k-means聚类,但在我看来它不适合这个问题。模糊散列似乎是考虑到产品的名称(这可能对iPhone很好,但不能用T恤成像,它们的名字不是很“准备好”,因此很难从中猜出差异名称)。我错过了什么吗?
那么,任何想法?
无论如何,只是为了解决这个特定的问题,可以引入不同的数据库解决方案,没有问题。
提前致谢:)
Chmelda
答案 0 :(得分: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
在插入来自电子商店的新数据时,您应首先将传入的组编号转换为您自己的组编号,然后再将其添加到“组”表中。 仅当您要在传入组(您提到的Group5)中分隔产品时才使用NameMatch字段。 因此,如果此字段为null,则只需转换ID。否则,只有在产品名称与NameMatch匹配时才转换ID。
要转换当前数据,可能有助于创建一个与“组”字段相同的新表(例如,Groups2),唯一的区别是Group是对新组编号的引用。 然后,您可以通过转换组的每个记录来填充新表。 转换完成后,删除Groups表并重命名Groups2表。
通过这种方式,您将获得更小的表大小,并且该表已包含合并数据,因此合并时不需要单独的查询。
希望这会有所帮助!