代码改变世界

关于【商品计量单位以及这些计量单位换算】的设计

2010-02-22 12:23  Virus-BeautyCode  阅读(5781)  评论(7编辑  收藏  举报

   前言

  大家在开发一些进销存系统的时候,肯定会遇到商品货物录入之类的需求,输入货物100吨,1000千克,进销存还简单一些,是内网应用,一个厂商不大可能又有重量单位的产品又有体积单位的产品。但是,如果是一个电子商务平台呢?上面的货物来自多个厂商,这就种类繁多了。在想一步,如果平台国际化了呢?加入国外厂商了,就会出现国际标准,甚至是一些国家的自己的标准(因为人家看的自己的标准舒服,你不能让人家都看你的标准吧)。公斤、斤、千克、克、升、毫升、米、毫米、磅等等都出来了,如何在一个系统中可以方便的兼容这些计量单位呢?也是大家在设计之初必须考虑的事情,而且会对后面的开发、维护产生重大的影响,不可小视。

  刚开完讨论会,会上大家又提到了商品(或者产品)单位和这些单位之间的换算如何存储以及计算,因为我们的系统计量单位繁多,多达20种以上,换算就更多了。下面有几种意见:

  1、个人用的时候,自己处理一下,每个人维护一套标准。

  这个种做法最后被抛弃了,因为不利于团队开发,个人用户还可以,每个人维护量太大,如果修改的话,维护量就更大了,消耗了工作量,在相同的工作时间中大家完成的是相同的工作。

  数据库的商品表格式如下

  

商品名称

商品数量

商品单位

土豆 100 公斤
白菜 200 千克
  2、使用公共类或者枚举来维护换算标准

  这个做法有人支持,相比第一种,这种统一的换算标准管理,将N个人的工作量变成了1个人的工作量,也算是一种重构吧。缺点就是,后期如果系统国际化了,需要加入国外的换算的话,需要修改,不够灵活吧。

  数据库的商品表格式如下

   

商品名称

商品数量

商品单位

土豆 100 公斤
白菜 200 千克

  3、用数据库记录

  增加灵活性、可扩展性,甚至添加计量单位和计量单位的换算都不用修改代码,直接在后天添加即可。

  单位表,记录全部可能使用的计量单位

   

单位编码

单位名称

1
2 千克
3
4 公斤

  单位换算表

   

源单位编码

目标单位编码

换算因子 

1 2 0.001
2 1000
1 3 0.02
3 1 500

  商品表格式如下

   

商品名称

商品数量

商品单位

土豆 100 1
白菜 200

 

  这样的话,随时可以添加计量单位和计量单位之间的换算因子,因为可以满足大部分需求。

  缺点

  1)但是还是有一点遗憾,换算表会很繁琐,数据量相当大,1-2、2-1、1-3、3-1这样搞下去的话,量还是比较大的,当然了,可以简化,2-1就不需要了,将1-2反过来就好了。

  2)好像不够标准,数据库换算有点乱,是不是大家都应该向一个标准看齐,都换算成一个标准来说话呢,这样是不是会更好一点呢?有待验证,就有了下面的修改

  3)如果有新的计量单位进来的话,划算表会很复杂,还容易遗漏呢。例如:上面是四种计量单位,现在我们引入磅,我们就要首先在计量单位表中增加一条记录,磅;因为磅是重量计量单位,它和公斤、斤、克、千克等原有的重量计量单位都可能有换算的需要,就目前来说就需要在换算表中添加四条记录,磅和公斤、磅和斤、磅和克、磅和千克的换算,遗漏一个都会出问题,想想随着计量单位的增加,换算表一次的增加量为计量单位表的条目总数,量可想而知。

  4、优化换算表

  新换算表格式

  

源单位编码

目标单位编码

换算因子 

1 1 1
2 1 0.001
3 1 0.02
4 1 0.001

 

  表中的1就是重量类单位的换算标准,大家都先换算成千克,在进行下一步的计算和比较,当然了,显示的时候还是显示成用户喜欢看到的格式,例如:公斤,磅之类的。

  这么做的优点有两个

  1)减少了换算表的维护量和数据量

  2)统一向一个标准单位换算,不同不标准单位的换算,先用两个不标准的都换算为标准单位,然后用换算出来的两个标准单位相比(相除),就得出了两个不标准单位的标准比例,这时候可以用标准单位计算、比较、显示,当然了,还可以根据需要显示为任何的非标准单位(只要反过来换算回去就可以了)。

   3)在没有优化划算表之前,添加一种计量单位,需要在换算表中添加N条记录,现在不需要了,因为每一类计量单位(目前想到的种类有三种:重量、长度、体积)都统一到一个标准的计量单位(量统一为千克、长度统一为米、体积统一为升),所以添加一个计量单位磅,只需要在换算表中添加一条记录,磅和千克的换算,即可,总共添加2条,而不是上面的1+N(N为计量单位表的总数)。

  其实有点像汇率的换算,在中国表现的时候都是100人名币可以换算多少各国货币,或者是100各国的货币可以换算多少RMB。

  上面都是我的一点小想法,希望做过类似复杂系统的老兄,给点指点,让我也长进长进。。!