2013-10-10 151 views
2

目前我正在處理一個電子商務項目的有點大mySQL事務數據庫。我們從電子商店獲得包括銷售產品的數據。每個電子商店都會添加有關產品之間相似性的信息,並將其列爲。所以,例如商店A發送信息mySQL數據庫:分離/集羣(?)數據

  • 組1:iPhone藍色,黑色的iPhone,iPhone的綠色
  • 組2:iPad的藍色,黑色的iPad,iPad的綠色等

另一個電子商店發送該種信息:

  • 3組:iPhone粉紅色,黑色iPhone
  • ģ roup 4:iPad的藍色,iPad的粉紅色

每個產品存儲在表產品:(重要:該表具有約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函數)以及這些組中的所有產品。然後更新表格組以將這些組合併成一個。

這種方法的主要問題是:

  • 很成問題的計算複雜度。
  • 從電子商店獲得的團體可能是錯誤的(!)。想象一下這個羣體:
    • Group5:iPhone黑色,iPad黑色。考慮到這個羣體,整個分離過程是錯誤的。最終你會得到一個與iPhone和iPad在一起的組合(這是錯誤的)。

所以,現在,終於,這個問題: 任何想法如何解決這個問題?只是提示/技巧就夠了,我只是完全被我缺乏知識所困擾。

我在玩模糊哈希算法/ k-均值聚類,但在我看來,它不適合這個問題。模糊哈希似乎正在考慮產品的名稱(這對iPhone來說可能很好,但是不能用T恤形象化,他們的名字不是很「精心準備」,所以很難從名稱)。我錯過了什麼嗎?

那麼,有什麼想法?

無論如何,只是爲了解決這個問題,有可能引入不同的數據庫解決方案,這是沒有問題的。

感謝提前:)

Chmelda

回答

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。

要轉換您的當前數據,可能有助於創建與組具有相同字段的新表(例如Groups2),唯一的區別是Group是對新組編號的引用。 然後,您可以通過轉換組的每個記錄來填充新表。 完成轉換後,放棄Groups表並重命名Groups2表。

通過這種方式,您將獲得組的小得多的表格大小,並且該表格已經包含合併的數據,因此不需要單獨的查詢進行合併。

希望這會有所幫助!