论坛首页 Java企业应用论坛

提问:关于数据库设计中外建的运用

浏览 20709 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-05-15  
当创建了主键外键关系后,如果没有设置级联删除级联更新的话,当删除主键时,如果外键存在该主键时,此时主键就不能删除,此时如果要删除的主键的话,必须先删除外键表中相应的行,然后才能删除主键表中的行,或者设置级联删除或者级联更新,这样,删除主键相应的外键表中的相应的行也就被删除了。不过我一般不会用级联删除和级联更新的,如果使用的话,当用户不注意删除了主键,那么外键也被删除了,很危险的,所以我宁愿手动删除,也不使用级联删除
0 请登录后投票
   发表时间:2004-08-23  
一. 外键不影响数据逻辑,它只是保证数据完整性的一种措施。外键可以防止程序放错误,如果可以绝对肯定没有错误,那么也可以不要外键。但是没有人能肯定程序不会犯错误,即使能肯定自己写的程序不犯错误,也不能保证别人写的程序不犯错误。使用外键,就是假设即使程序会犯错误,但是设计者可以阻止这个错误。这是设计者的责任,不是程序员的责任。
要不要外键,其实和编程时要不要catch Exception的原因是一样的。外键和错误检查会降低效率,也许在某种性能要求极高的极端的情况下,会牺牲错误检查来换取效率。但是在性能许可的情况下,还是应该尽可能的使用外键。这就象我们即使知道一段代码是正确的,还是会给它加上错误处理一样。
二、业务主键和逻辑主键的问题(微软称作自然键和人工键)
一般应该采用人工主键。我一开始就是这么认为的,后来从微软和IBM的网站上证实了这种方法几乎是设计的定式。
自然键和人工键的对比:
1、自然键的主键是冗余的。
因为对于自然主键作为表实际的主键的时候,主键本身的信息是冗余的。在这里,主键既表达它自身具有的信息,又要表示数据之间的关系,这样在数据之间的关系不变的情况下,要更新主键的信息就很困难。如果在表间建立了外键,而数据库又不支持级联更新,那么可能会造成无法更新主键的信息。引入人工键,就是为了让信息的表示和关系的表示分离,人工键表示数据之间的关系,原来的主键作为一个普通的字段表示信息(当然要加上唯一索引)
2、主键应该尽可能的短,而自然键通常不能满足这个要求。
主键对关系数据库的性能影响很大。有效的查询必须通过索引来进行。在索引查找的每一步都要用到比较操作。一个人工键通常只需要四个字节,而一个Unicode字符可能就要两个字节,40个字节的字符串的比较操作耗费的时间要比四个字节相差一个数量级(如果考虑Unicode字符串比较的复杂性,耗费的时间还要大大高于这个数字)
三、好的OO设计和范式是不矛盾,结构的美其实是相似的。
不管我们发现对象的步骤如何,最后我们总要把它存储到关系表中。只要有存储,就会有一个冗余信息处理的问题,这个时候就需要考虑数据库的规范化。存在冗余信息的设计,必然会造成更新的复杂性。一般说来,好的oo设计,一般自然而然就会符合3NF。比如下面这样一个违反3NF的设计,在好的oo设计中也不会出现。一般来说,都会把厂站作为一个单独的对象来存储,而厂站这个对象,是设备的一种属性。在这里,只要储存一个对产站的引用就可以了,所以我们存储厂站的ID。
设备编码(sbbm)  厂站名称(czmc)  厂站地址(czdz)  设备型号(sbxh)
10101              神州面粉厂      神州            E66II面粉机

冗余的设计,必然要牺牲数据的完整性,或者增加更新的复杂性。所以,如果数据库中出现了违反3NF的现象,而又不是因为效率刻意去牺牲更新的简单性换来查询的高效率造成的,那么这个设计可能有很大的问题。一个结构不良的数据库,通常没有什么维护的价值。

这些设计原则,很多国外的公司都是作为定式使用的。OO并不否定科学,如果它否定科学,那么它就是一种迷信。E.F.Codd是图灵奖得主,并非浪得虚名之辈。否定关系数据库理论不是一件容易的事情(实际上关系数据库理论有雄厚的数学基础,非UML所能相比),只要还在使用关系数据库,那么就不能不考虑范式。不过最奇怪的问题在于,是不是每个设计者都真正理解了范式?根据我的观察,包括一些一类院校的博士都会设计出不符合3NF的数据库,而实际上项目并不是对查询效率有极高的要求。我以为,不能正确理解数据库的范式的系统分析员,一定是不合格的。
0 请登录后投票
   发表时间:2004-08-31  
关于外键约束,我觉得是最好不要建,以前遇到到很多情况不得不把外键约束拿掉。
比如说我要修改外键的值的时候,那么这个时候不管是先修改主表还是从表都是违反外键约束的.
0 请登录后投票
   发表时间:2004-10-24  
yashen 写道
关于外键约束,我觉得是最好不要建,以前遇到到很多情况不得不把外键约束拿掉。
比如说我要修改外键的值的时候,那么这个时候不管是先修改主表还是从表都是违反外键约束的.

这个就是数据库设计的问题了。一般来说,应该采用人工生成的值作为主键。原来的主键上建唯一索引。如果用人工键替代自然键,就没有更新主键的需求。这个是数据库设计的基本定式了。人工键用来表达关系,原来的逻辑主键存储数据,避免主键信息的冗余。
至于级联删除,我以为可以使用。因为在建立了外键的情况下,最后子表的数据肯定是要删除的。使用级联删除,可以减少编程的工作量,避免再写一堆事务等乱七八糟的东西。
建外键的时候,是可以允许空值的。先说一下,免得有人把这个也拿出来讨论。
无数的烂项目,就是从不要外键开始的。搞到最后,一堆的脏数据,没人收拾。
可能说话的口气不是太好,希望您不要介意。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics