凤舞凰扬的关于数据库话题摘要 数据结构
程序员文章站
2022-07-10 12:17:46
...
做过MIS系统的都知道,一般说来,数据分为两种:基础数据和业务数据。一般说来,业务数据中肯定包含多个基础数据,比如简单地说一张机票数据,它就包括:货币类型、机场、航空公司等多个基础数据,这个时候,如果都要建立FK的话,是没有任何意义的,更不需要去考虑什么级联删除的,结果只有一个,严重影响效率,而且结构凌乱。但是在业务数据中,机票的基本信息和机票的价格构成了一个整体,这个时候如果不使用FK,那么在设计上是个失误,在实现的时候也绝对是个隐患!比如删除的时候,删除了机票,但是留下了机票的价格,大家可以相信,这是多么荒谬的事情。
所以,使不使用FK,关键要区分基础数据和业务数据。
另外,一个好的数据库设计并不是纯粹考虑数据库,而是来源于好的业务建模和对象建模。
首先基础数据的不存在并不能代表业务数据的不存在或者逻辑错误,其次,比如基础数据,是不能随意删除的,当然,我们有很多的控制方法,比如失效等什么的。对于基础数据不用外键是综合各方面考虑的,不是说不能用外键,但是用了外键将导致一个非常可怕的问题,就是数据访问的问题,每访问一个业务数据,那么意味着有可能要join访问10个以上的表,效率会严重降低。
好的数据库设计不能是没有一点冗余,或者说严格符合关系要求,因为实际的应用是面向对象的,在将面向对象的数据转换为面向关系的数据时,是需要这样做的。从逻辑上说,一个基础数据的不存在,并不代表什么,比如说,你没有输入一个国家或者删除一个国家,并不代表没有了这个国家。而业务数据就不同了,如果你删除了一张业务数据,那么就代表了该业务数据已经不存在,而此时再存在与之相关的业务数据是不符合逻辑的(比如一个法规作废,那么与之相关的法规就都必须受影响)。
好的数据库设计来自于好的对象设计。
所以,使不使用FK,关键要区分基础数据和业务数据。
另外,一个好的数据库设计并不是纯粹考虑数据库,而是来源于好的业务建模和对象建模。
首先基础数据的不存在并不能代表业务数据的不存在或者逻辑错误,其次,比如基础数据,是不能随意删除的,当然,我们有很多的控制方法,比如失效等什么的。对于基础数据不用外键是综合各方面考虑的,不是说不能用外键,但是用了外键将导致一个非常可怕的问题,就是数据访问的问题,每访问一个业务数据,那么意味着有可能要join访问10个以上的表,效率会严重降低。
好的数据库设计不能是没有一点冗余,或者说严格符合关系要求,因为实际的应用是面向对象的,在将面向对象的数据转换为面向关系的数据时,是需要这样做的。从逻辑上说,一个基础数据的不存在,并不代表什么,比如说,你没有输入一个国家或者删除一个国家,并不代表没有了这个国家。而业务数据就不同了,如果你删除了一张业务数据,那么就代表了该业务数据已经不存在,而此时再存在与之相关的业务数据是不符合逻辑的(比如一个法规作废,那么与之相关的法规就都必须受影响)。
好的数据库设计来自于好的对象设计。
推荐阅读