2010-05-22 79 views
4

我爲履行公司工作,我們必須打包並將許多訂單從我們的倉庫發運給客戶。爲提高效率,我們希望對相同的訂單進行分組,並以最佳方式對其進行打包。相同的我的意思是具有相同數量的包含相同SKU和相同訂單數量的訂單行。使用哈希來分組類似的記錄

爲了實現這一點,我正在考慮散列每個訂單。然後我們可以通過散列來快速查看哪些訂單是相同的。

我們正在從一個Access數據庫轉移到一個PostgreSQL數據庫,並且我們有基於.NET的數據加載和一般訂單處理系統的系統,所以我們可以在數據加載期間做散列或者把這個任務交給數據庫。

我的問題首先是應該由DB管理哈希,可能使用觸發器,或者應該使用視圖或其他東西動態創建哈希?

第二,最好是爲每個訂單行計算一個散列,然後將這些散列組合起來,以便爲分組查找訂單級哈希,或者我應該在訂單行表上使用所有CRUD操作的觸發器重新計算整個訂單的單個散列並將該值存儲在訂單表中?

TIA

+0

GROUP BY子句是爲此目的而發明的;您甚至不必考慮底層實現是否使用哈希。 – 2010-05-25 12:25:22

回答

1

除非你有要求的制約這一點,你可以把其中你覺得最舒服的哈希值。例如,在.net中編碼比在SQL中編碼要容易得多。如果數據庫中的訂單不是直接修改,而是通過所有應用程序使用的數據訪問層,則這是一種可行的方法。數據訪問層然後可以管理散列。

即使使用散列,您仍然必須檢查散列訂單是否確實相同。這是因爲創建一個完美的散列函數非常困難 - 這是一個沒有碰撞的函數,所有對象都散列到不同的值,對於結構可能有很大差異的數據。

這表明您需要一個查詢(或代碼),給定一組訂單,確定其中哪些實際上相等,將它們分組爲等價集。例如。映射到相同哈希碼的順序 - 它們是否真的相等。如果你從這裏開始,那麼這個查詢也可以用來從整個數據庫中查找重複的訂單。它可能並不快,在這種情況下,您可以通過在訂單插入/更新時使用哈希來改善性能。