2010-05-22 81 views
4

我为履行公司工作,我们必须打包并将许多订单从我们的仓库发运给客户。为提高效率,我们希望对相同的订单进行分组,并以最佳方式对其进行打包。相同的我的意思是具有相同数量的包含相同SKU和相同订单数量的订单行。使用哈希来分组类似的记录

为了实现这一点,我正在考虑散列每个订单。然后我们可以通过散列来快速查看哪些订单是相同的。

我们正在从一个Access数据库转移到一个PostgreSQL数据库,并且我们有基于.NET的数据加载和一般订单处理系统的系统,所以我们可以在数据加载期间做散列或者把这个任务交给数据库。

我的问题首先是应该由DB管理哈希,可能使用触发器,或者应该使用视图或其他东西动态创建哈希?

第二,最好是为每个订单行计算一个散列,然后将这些散列组合起来,以便为分组查找订单级哈希,或者我应该在订单行表上使用所有CRUD操作的触发器重新计算整个订单的单个散列并将该值存储在订单表中?

TIA

+0

GROUP BY子句是为此目的而发明的;您甚至不必考虑底层实现是否使用哈希。 – 2010-05-25 12:25:22

回答

1

除非你有要求的制约这一点,你可以把其中你觉得最舒服的哈希值。例如,在.net中编码比在SQL中编码要容易得多。如果数据库中的订单不是直接修改,而是通过所有应用程序使用的数据访问层,则这是一种可行的方法。数据访问层然后可以管理散列。

即使使用散列,您仍然必须检查散列订单是否确实相同。这是因为创建一个完美的散列函数非常困难 - 这是一个没有碰撞的函数,所有对象都散列到不同的值,对于结构可能有很大差异的数据。

这表明您需要一个查询(或代码),给定一组订单,确定其中哪些实际上相等,将它们分组为等价集。例如。映射到相同哈希码的顺序 - 它们是否真的相等。如果你从这里开始,那么这个查询也可以用来从整个数据库中查找重复的订单。它可能并不快,在这种情况下,您可以通过在订单插入/更新时使用哈希来改善性能。