如何设计数据库约束?
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




