CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

如何设计数据库约束?

楼主jxwangjm(师铭)2005-04-12 09:11:38 在 MS-SQL Server / 基础类 提问

1>约束之一:外键。在数据库中要不要设置外键,而是在程序中用代码(比如VB代码)检查数据的有效性。  
  2>有些如Nvarchar的字段,但是可能只能有某些限制字符,如ID,只能有字母,数字和_之类的字符,不能有中文等,是在程序中限制,还是在数据库中限制。  
   
  希望大家给本人一点帮助。顶者有分。 问题点数:100、回复次数:12Top

1 楼jxwangjm(师铭)回复于 2005-04-12 09:15:08 得分 0

1>自个UP先。  
  2>我倾向在数据库中使用约束,我进过两个公司,都是在程序中控制数据的有效性。但是说不出理由来。Top

2 楼piaoyi_1(飘逸)回复于 2005-04-12 09:23:24 得分 5

主键约束、唯一约束、CHECK约束、外键约束Top

3 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-04-12 09:28:07 得分 15

1、我习惯于使用外键  
   
  2、在程序中以及数据库中都作出限制Top

4 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-04-12 09:50:15 得分 0

我进过两个公司,都是在程序中控制数据的有效性。但是说不出理由来。  
  ---------------------------------------------------------------  
  不需要经过访问数据库即可确定的错误,当然应该在程序入口处就处理掉。  
  一个简单的约束,在客户端通过脚本即可判定,程序效率也会高,否则,把所有的错误都扔给数据库处理,增大了数据库的开销不说,也一定程度上降低了应用系统的处理速度和性能。  
   
  当然,数据库中仍然应该建立约束,以防止在程序中的人为疏忽以及其他非应用程序入口所录入的数据导致数据库中保存的数据违反了设计时的约定。Top

5 楼zjcxc(邹建)回复于 2005-04-12 10:15:36 得分 60

程序中限制,有利于在多种数据库之间切换时,处理较少的东西  
  因为不同的数据库产品的处理方法不同,如果将这些处理放在数据库中的话,当你从一种数据库切换到另一种数据库的时候,你必须把这些处理在另一种数据库中重做,如果另一种数据库不支持某些东西,你必须改程序代码  
   
   
  Top

6 楼Hopewell_Go(好的在后頭﹗希望更好﹗﹗)回复于 2005-04-12 10:16:46 得分 10

樓主的兩種情況在數據庫中限制好。  
  因為好多類似這樣的問題。  
  讓數據庫本身去限制性能要好一些。  
  Top

7 楼zjcxc(邹建)回复于 2005-04-12 10:18:19 得分 0

在数据库中处理,   可以大大减少程序处理的工作量,效率较高  
  由于很多东西是直接在数据库中处理,数据库本身对这些处理(比如外键约束)会做优化,而且也不需要在数据库与程序之间交互数据,所以效率一般比程序中处理高.  
  而且,由于是在数据库级别上做处理,所以,无论你是用程序,还是用其他软件或者数据库本身去操作数据,这些处理都会受数据库上设置的处理过程的监控和再次加工,可以防止在程序之外处理数据时,导致数据混乱Top

8 楼TOMATOTO(蓝蓝)回复于 2005-04-12 10:40:08 得分 10

约束有时候,我觉得是搬起石头砸自己的脚!都怪自己水平太低!特别是外键约束Top

9 楼zjcxc(邹建)回复于 2005-04-12 11:42:34 得分 0

--这就是级联表的创建方法,主表id更新时,从表a_id自动更新,主表id删除时,自动删除从表a_id对应主表id的记录  
   
  --检查对象是否存在,如果存在,删除  
  if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[从表]')   and   objectproperty(id,   N'isusertable')   =   1)  
  drop   table   [从表]  
   
  if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[主表]')   and   objectproperty(id,   N'isusertable')   =   1)  
  drop   table   [主表]  
  go  
   
  --创建表环境  
  create   table   主表(id   int   primary   key ,name   varchar(10))  
   
  create   table   从表(id   int   identity(1,1)   primary   key  
  ,a_id   int   constraint   FK_从表_主表   foreign   key  
  references   主表(id)   on   update   cascade   on   delete   cascade  
  ,name   varchar(10))  
  go  
  Top

10 楼zjcxc(邹建)回复于 2005-04-12 11:43:29 得分 0

不好意思,搞错地方了Top

11 楼jxwangjm(师铭)回复于 2005-04-12 12:50:13 得分 0

假如我在数据库中有设置这些约束,(我讲的是包括那些诸如Trigger之类的),那我程序中难道也要去检查数据有效性吗,这是不是太浪费了。如果不检查的话,程序很有可能会崩溃,有没有好一点的方法?我感觉用Adodb.connections的Error事件和Errors属性可以处理,但只是感觉,希望各位高手和高高手指点一二。Top

12 楼zjcxc(邹建)回复于 2005-04-12 13:37:27 得分 0

数据库中做了约束,程序中当然不用检查,程序中只需要使用错误处理机制,拦截错误信息就知道是怎么回事了Top

相关问题

  • 数据库如何设计
  • 这样的数据库如何设计?
  • 这个数据库如何设计?
  • 如何设计这样的数据库
  • 这样的数据库如何设计?
  • 大家如何设计数据库的
  • 这样的数据库如何设计?
  • 这样的数据库,如何设计?
  • 如果数据库中要存储图片,如何设计数据库?
  • 数据库设计

关键词

  • 数据库
  • 数据
  • 有效性
  • 代码
  • 检查
  • 约束
  • 主表
  • 程序
  • 处理
  • 表

得分解答快速导航

  • 帖主:jxwangjm
  • piaoyi_1
  • libin_ftsafe
  • zjcxc
  • Hopewell_Go
  • TOMATOTO

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo