谈谈数据库设计——避免多义性

发表于:2013-4-15 09:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:十三燕    来源:51Testing软件测试网采编

分享:

  3、可维护性比较差

  在用户使用了一段时间以后,觉得这个功能还可以再表现出更多信息将会更好。比如入库时填写物料的来源(供应商),出库时填写物料领取者(部门)。

  程序中为领域建模时,建立的是入出库,那么在入库时将会把领取者属性设为空,这就需要人为地区分,哪些属性是入库,哪些属性属于出库。

  但通常领域驱动设计会直接把他们抽象为入库和出库两个领域对象,而数据库设计时自然也会分为两张表,不然只有在领域对象中加入单据类别属性。

class 入库单据

    public char 单据类别
   {  
        get{return 'i';} 
    }
}

class 出库单据

    public char 单据类别
   {  
        get{return 'o';}
    }
}

  是的,你得关注当初设置这个类别字段时i代表什么意思,o又代表什么意思,可能它是0代表入库,1代表出库,反正你得去看一下。

  总结:一个糟糕的设计不但对性能造成影响,还让程序设计变得复杂。当程序员听到“又要该”时,脸色通常都会比较难看,因为在糟糕的设计下,维护的成本很高,编程就变得不那么愉快。

图2

  解决了一部分问题,但是申请单据ID的问题还是没有解决。

图3

  似乎是不错的设计,但是在统计总的入库单据时需要做一个视图,把两种情况的入库单据做union。

  另外如果有要求入库时需要申请单据和不需要申请的单据也不能重复,那么需要在另一张表里检测单据编号是否存在再插入记录。

  总结:消除了字段两意性以后,编程时就少了一些if else 或者是SQL 语句中少了些where ,每个领域对象也不必关注与它无关的事情。也避免了由程序控制不当造成的数据不完整,后期维护会少了很多意想不到的问题。

22/2<12
价值129的会员专享直播免费赠送,添加微信领取听课名额哦~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海漕溪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号