是否需要给数据库中的表与表之间建立关系

建立数据库时,根据系统的需求结合数据库设计理论(如BNC范式规则等等)设计各个表。把表的初步结构定出来。然后把各表的关键字有关系的建关系。这就ok了吗???
我认为不是应该是这样的。
我先来跟大家探讨一下儿数据库表间建立关系的利与敝:
利:如果你的关系建立的没有错误的话数据的参照完整性肯定能得到保证,不会出现数据不一致的情况。实现级连删除非常方便。省去了为保证参照完整性用代码保证级连删除的工作。

既然建立关系有这么多的优点,那我们是不是在我们做每个项目的时候,只要遇到有关系的表就都建立关系呢?非也。因为建立了关系后,当我们改动某个数据表中的数据时,数据库引擎都要检查和这个表建立了关系的表,校验所做的改动是否符合参照完整性,肯定会浪费一定的时间,具体要耗费多少时间,与数据量的多少和表间关系的多少有关。

举个实际的例子:
拿动网论坛来说,论坛运行起来后,随着注册用户的增多。数据量会越来越大。
下面是我刚从动网论坛首页copy的统计信息:
论坛共有 250780 位注册会员 , 主题总数:366512 , 帖子总数:2449376
今日论坛共发贴:1360 , 昨日发贴:4574 , 最高日发贴:12533
论坛的数据库结构是这样的,只列出几个关键的字段:
bbs1表:
PostuserId    发贴用户id号
PostuserName  发贴用户名
BoardId       所属版面id

Board 表:
BoardId
BoardName

user 表:
userId    用户id号
username  用户名

(注:三个表间,在数据库结构中没有建立关系)

我们就拿这三个表来说,建立关系应该是:
bbs1.PostuserId 与  user.userid 多对一
bbs1.boardId  与  Board.boardId 多对一
如果你把这三个表建立了如上的关系,那么实际运行起来应该是这样:用户发贴时,要在数据空中insert bbs1 ......,插入记录时数据库引擎先搜索插入的用户id值在user表中是否存在,还要检查BoardId值在board表中是否存在。这种情况在数据量小的时候可能并觉察不出什么性能的问题,但是看看上面我列出的动网的数据量,你是不是应该有些感想。其实这些检查根本豪无用处,因为你作为一个用户发帖子时,用户id,与用户名是从user表中取出的,肯定不会出现没有的情况。同理版面id的校验也是一点儿用都没有的。

参照完整性还是要保证的,我们可以通过代码来实现级连删除表数据。

还有动网在bbs1 表中设的字段,按理论userName是一个冗余的字段,但是这样设我想是经过充分考虑的,有时候某个表设定冗余字段,给程序的设计或系统的效率会带来很大的方便。

我要在这里说的就是在实际的工作中,我们不能生搬教条。书本给出的都是基本的理论,按理论设计没有错,但如果不结合具体的应用实际。那设计出来的东西肯定是低效的。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值