悟空-简单就好
.net企业级应用研究

考虑最复杂的情况
开发出最简单的实现


多种方式,帮你快速找到文档(知识点)!

  摘要: 给大家提个醒,“数据库的机制”的重要性是保证数据正确的最后关卡,而不要图省事,完全依赖于程序的逻辑代码;必竟,你不能考虑到所有的可能情况,特别是大量并发的情况下;虽然出错的概率也许只有万分之一,但只要存在,迟早会发生。
数据库设计好了,很多事情自然水到渠成。
   

   做软件开发,特别是做数据维护的工程师,遇到最多的问题应都可归结为数据库的不一致性和完整性问题。多年的软件开发,看过很多SQL/Oracle/Access的数据库,包括台湾MES厂商、国内很多共享软件等,基本没有设置Key、FK,很多的软件连范式二都达不到;数据库的一致性和完整性往往是通过程序逻辑实现,必然在并发的情况下,在万分之一的可能情况下,发生数据的不一致性和完整性问题。

   分析过MS的CRM、RP、MOSS等专业性的软件,不难发现其在数据库设计方面逻辑的严密性。结合自己的经验,得出:业务逻辑是通过代码实现的,但是要通过“数据库的机制”来确保逻辑的正确性,而不能完全依赖于程序代码,必竟有很多的情况是程序软件中所无法预料的;只能通过“数据库机制”做最后的检查,NG时返回失败;而不是怕用户一时的抱怨,造成后期的排错和数据维护量。

   当然,使用“数据库机制”必然带来下述的影响:
 1、一定程度上影响性能
 2、增加程序开发的难度:符合“数据库的机制”的要求,必然要作更多的检查;否则可能造成无法新增和修改。所以,很多开发人员为了图简单和赶进度,当然是能省就省。再说了,走人后,出现的问题又不用自己来解决,关键是当前的问题能糊弄过去就万事大吉了。

  要允分使用“数据库机制”,至少是满足下述两者之一
  一是开发人员的自觉性,不能图省事;特别是架构师或数据库开发工程师
  二是Leader是要有这种意识,否则.....

  那么,这里的“数据库机制”指什么呢?不外是主键、外键、事务、唯一索引、范式、级联更新等

   经验表明,多数的应用程序问题都是围着数据库转;所以从事软件开发和开发管理人员,一定要学的是“数据库的设计艺术”这门必修课,才能事半功倍。

 欢迎大家就开发MES系统、电子采购系统、进销存系统、网站等的数据库架构、开发和维护进行交流。


相关链接:
数据库设计经验谈(转)

posted on 2007-02-13 10:09 针式个人知识库管理 阅读(2620) 评论(16)  编辑 收藏
Comments
  • byrybye [未注册用户]
    Posted @ 2007-02-13 11:01
    ??????????
    数据已经有的功能,有人不用自己用程序写??
    有这样的情况吗???   回复  引用    
  • #2楼 [楼主]
          
    Posted @ 2007-02-13 11:22
    @byrybye

    数据已经有的功能,是不是应为“数据库已经有的功能”
    一般情况下,会在CURD前,会进行数据的规格检查、业务逻辑检查等,以尽量保证CURD的成功(CURD失败会造成一定的性能损失),检查失败和CURD失败给用户的信息是有一定的区别的   回复  引用  查看    
  • #3楼 
    zz [未注册用户]
    Posted @ 2007-02-13 11:30
    我发现有些软件在数据库中写了大量的存储过程,并新建许多的视图...
    我比较喜欢在程序的代码中实现数据库逻辑,如果级联更新,事务,录入数据的格式检查,数据库对我来说就是存储数据并提供读写操作的软件罢了,,不知这个做法是否正确?   回复  引用    
  • #4楼 
    byrybye [未注册用户]
    Posted @ 2007-02-13 11:57
    前面确实笔误,哈哈,数据更新前。校验是一定要的
    这里性能损失很正常,数据时在校验后,才更新数据的
    反馈的错误信息当然不同。不过我觉得这个和
    在数据库里使用 约束 来保证数据完整性 没有什么矛盾吧。
    既然数据库提供这样的功能给你,你为什么不用呢,
    呵呵,实话说 我还没见到过有人这么设计。   回复  引用    
  • #5楼 [楼主]
          
    Posted @ 2007-02-13 12:00
    @zz
    1、写了大量的存储过程,并新建许多的视图:这种做法可最大发挥该数据库的特性和性能,对于不必支持多种数据库服务器(SQL、Oracle等);这种做法最佳。
    2、数据库对我来说就是存储数据并提供读写操作的软件罢了:这句话存在的问题正是本文所述,你可以再好好阅读一遍   回复  引用  查看    
  • #6楼 [楼主]
          
    Posted @ 2007-02-13 12:02
    @byrybye
    在数据库里使用 约束 来保证数据完整性 没有什么矛盾吧。
    既然数据库提供这样的功能给你,你为什么不用呢,

    本文的观点正是这样的啊,即首先是在数据库中利用数据库的机制来保证数据完整性等;程序逻辑也是必须,但不能完全依赖
      回复  引用  查看    
  • #7楼 
    小陆      
    Posted @ 2007-02-13 13:21
    有的事务是没有办法“用数据库的机制”来保障的,比如ATM机取款的时候,账户余额减少、账目记录、机器吐钞票,这三个动作是一个事务,第一个和第二个动作你可以用数据库的机制来保证,第三个动作只能用应用程序来控制。你也不可能先把数据表锁住,等钞票吐完了再解开,这样会造成大量的并发事务,数据库根本无法承受。
    数据库的事务使应用程序设计起来很简单,但是他只能保证数据本身的完整和一致,一旦牵涉到设备,ATM机、交换设备……应用程序是唯一的保证。
    数据库的事务和约束不是万能的,他只能在系统的某个方面有效果。   回复  引用  查看    
  • #8楼 
    byrybye [未注册用户]
    Posted @ 2007-02-13 14:17
    呵呵 小陆说的很深奥哦,我们的系统也涉及设备
    不过不是ATM,我们做仓储物流,涉及到,堆垛机,
    输送机,分拣机,电子标签......
    如果多个操作没有办法放到一个长事务里完成的时候,
    那么我们的做法通常是,划分成几个可以分别提交的事务,
    在处理结束后,进行数据校验,如果数据异常,那么需要记录异常,
    并进行处理。但是这些东西是不是不是这里讨论的范围。
    楼主时说用什么方法保证数据的正确性??呵呵   回复  引用    
  • #9楼 [楼主]
          
    Posted @ 2007-02-13 15:58
    @byrybye
    你所说的不就是MES系统吗?
    保证数据的正确性本文中已说明:
    1、通过程序代码逻辑保证,强调一点的是:但不仅能依赖于程序;
    2、最本质性的保证是使用数据库机制:主键、外键、约束等,使不正确性的数据不会被更新到数据库(正确和不正确是根据实体所在上下文<环境>来确定,不能定性而言)

    数据的正确性的定义:实体所反映客观(真实世界)的语义属性;例如商品目录表,通过主键保证所有订单指向的某一商品是唯一确定的;至于说品名的约束,对于同样一种物品,不同人的理解可能是不同的,会造成不同的记录指向真实世界的同一事物,即语义不同;我想这一点计算机目前还不能做到智能识别(有的系统可能会有相似物的提示)

      回复  引用  查看    
  • #10楼 [楼主]
          
    Posted @ 2007-02-13 16:06
    @byrybye
    在处理结束后,进行数据校验,如果数据异常,那么需要记录异常。
    针对这一点个人理解:
    1、数据异常的要记录--这问题不大
    2、问题在于为什么要让数据异常发生?本文的看法是CURD前要进行检查,尽量避免预期的异常情况的发生(有很多的数据异常是可以预期的);对于极少数不能预期的异常,通过“数据库机制”来达到不会写入数据库,从而最大程度上保证我们在设计数据库时所做的假设,始终满足!!

    上下文、假设是一些非常难于理解的概念,其实,不管是数据库的设计、软件设计,无时不存在上下文和各种假设。   回复  引用  查看    
  • #11楼 
    byrybye [未注册用户]
    Posted @ 2007-02-13 16:40
    @悟
    问题在于为什么要让数据异常发生?本文的看法是CURD前要进行检查,尽量避免预期的异常情况的发生(有很多的数据异常是可以预期的);

    首先我不知道你说的那个MES是什么系统,不过对于你的这个观点我觉得不合适,很多数据异常时可以预期的,我相信。可是数据库对于程序员而言,可以预期的并不重要,那不可预期的呢??不可以预期的就不考虑了??

    还有前面回复小陆的话,主要是针对 与设备联动,而设备异常,导致整个业务,部分完成 部分没完成。
      回复  引用    
  • #12楼 
    byrybye [未注册用户]
    Posted @ 2007-02-13 16:46
    刚发现 楼上的就是楼主,
    哈哈 我觉得这个问题和好像不需要讨论下去了。
    如有得罪的地方,恳请谅解。哈哈
    其实这个文章的意义就是

    保证数据的正确性本文中已说明:
    1、通过程序代码逻辑保证,强调一点的是:但不仅能依赖于程序;
    2、最本质性的保证是使用数据库机制:主键、外键、约束等,使不正确性的数据不会被更新到数据库。

    不过,偶真的是不知道,有人不这样做吗?还是有别的选择吗?
      回复  引用    
  • #13楼 
    yi [未注册用户]
    Posted @ 2007-02-13 18:03
    数据库关卡是最后保证数据完整性的关卡   回复  引用    
  • #14楼 [楼主]
          
    Posted @ 2007-02-13 18:06
    @byrybye
    ==>看过很多SQL/Oracle/Access的数据库,包括台湾MES厂商、国内很多共享软件等,基本没有设置Key、FK,很多的软件连范式二都达不到。
    绝大部分的进销存共享软件、DISCUZ(Access)等等。所以写本文的目的只是给未注意到此问题的人提个醒,相互交流而于。
    谢谢你的评论,让大家可以知道得更多   回复  引用  查看    
  • #15楼 
    YAO.NET℡      
    Posted @ 2007-02-13 18:39
    ""一定程度上影响性能"

    我觉得这算是基本的开销,应该不是重要问题。看从什么角度去理解。   回复  引用  查看    
  • #16楼 
    蓝奇高级验证码识别引擎QQ:631753663 [未注册用户]
    Posted @ 2008-04-09 00:04
    出售蓝奇高级验证码识别引擎,可准确识别新浪动网淘宝CSDN等多种复杂验证码。

    输出为一个标准DLL,可供VB,VC,Delphi,C#.NET,VB.NET,模拟精灵,按键精灵等多平台调用,调用方法简单,几行代码即可完成。独具特色的边缘检测字符分离、旋转倾斜纠正和通用字符匹配算法(无论字体和大小), 使得该引擎对于像新浪、动网、淘宝、CSDN等多种验证码均有不错的识别率,是一款效果较为理想的验证码识别引擎。附详细的调用实例和代码注释等相关技术文档。

    官方网站 - http://***/yzm_advocr
    识别效果怎么样一试就知道 - DEMO下载 http://***/yzm_advocr/advocr.rar
      回复  引用    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-02-13 18:19 编辑过
 
另存  打印