数字与或非处理表中的多个状态(一)

在项目中的某此表中经常需要记录它的状态,打个比方说当我有一个订单表时,它经常会存在很多状态,在创建这个表的时候,也许我只知道他存在于两个状态,如下所示:
订单表 订单ID     订单编号     订单名称     是否审核   是否发货   创建日期.....
这里用红色标示的就是两个状态,是否审核,这里的状态是True和Flase或是0或1,而是否发货也同样是这样子的一个值,我用这个表结构来写了程序,用起来一直没有问题,直到......
某天客户说除了审核和发货之外,我需要有一个状态来标示客人是否收到货物,于是正常的思维,我将给他加上一个字段,表结构就成了这样子
订单表 订单ID     订单编号     订单名称     是否审核   是否发货   是否收到货物   创建日期.....
这里新增加的字段状态也是TRUE和FALSE或是0和1,接下来我将以前的程序修改了一下,它看来工作的也不错,直到......
客户某天说,是否收到货物不指是与否,还有合格不合格,是否退货,也就是说原来的是否收到货物这个客户用了一段时间后发现不是他想要的,他想要的是一个可以记录客人那边真实的多种状态的一个东西,简单的说是否收到货物这个应该是“货物到达后状态”,而它的状态可能是0未收到  1收到了  2很满意  3不满意   4要求退货,呜,这个时候如果以前将“是否收到货物”建成了BOOL的字段那就悲剧了,如果是INT还稍微好一点,但是依然需要做大量的工作改数据库和程序来适应新的这状态,更糟糕的事情接下来又发生了,一段时间后客户发现这个订单又要增加一些状态,而且过段时间客户也许又要增加一些状态。悲剧一遍遍的重演,我们生活在痛苦中,也许经常了几次修改后这个表成了下面这个样子
订单表 订单ID     订单编号     订单名称     是否审核   是否发货   订单到达后的状态     订单发送前的状态   运输中的状态  .......N   创建日期.....
这让我不得不停下来思考一下,我是否能够用一种字段来记录下来所有的状态,如下:
订单表 订单ID     订单编号     订单名称     订单状态   创建日期.....
比如我用数字0-N来记录N种状态。但是这个里面有一个很大的缺陷,就是它无法记录多种状态同时存在的值,如值4我定义为已经发货,值5我定义它为订单到达到客户不满意,使用的过程可能是这样子的,当订单发货时将状态字段更新成4,当客户收到货后不满意时被更新成5,好,看来来没有问题,但是问题来了,假如我希望统计出所有已经发货的订单,要如何做?实际这个设计很难做到这样子,于是我开始想如何才能用一个字段来保留住所有的状态。
终于没有花太多的时候我找到了一种更为便捷的方法,就是使用1,2,4,8,16,32,64,128,256,512,1024,这样子的数字来解决这个问题,通过数字间的与或非来解决一个数据库表中一个字段记录所有状态的功能。 待继下文

posted @ 2011-07-17 00:16  碧玉软件  阅读(254)  评论(0编辑  收藏  举报