Access开发中建表的基本原理和规范(下)

接着上一篇
1、一般来说每个表都应该建立一个主键,主键也是主索引,大部分主键都建立在一个字段之上,但并不是说主键就只能是一个字段,它也可以建立在多个字段上。比如订单我们分成了“订单表”和“订单明细表”两个表,在“订单表”中我们用“订单号”作为主键,而在“订单明细表”中我们就可以用“订单号”和“产品编号”两个字段来做为主键。
根据微软官方的建议是尽量使用自动编号字段来作为主键字段(自动编号这种数据类型的用处也就主要是用在这里),不过并不是所有的时候都适用,还是得根据实际情况而定。一般使用自动编号作为主键,主要也就是用来和其它表建立关系之用,像在录入窗体中一般无须显示出来。使用自动编号的好处是它的数据由数据库引擎自动维护,并且不可修改,我们只要拿来用即可,而无须去关心在添加、修改数据时候要怎么处理它。不便之处是它只会在使用过后最大编号上自动加1,如果我们删除了某些编号,这些编号不会被重续填补。
2、对于经常用来查询的字段我们可以对其建立索引。索引建立的原则是,尽量只对数据小且基本不存在空记录的字段建立索引。但是索引不能建的太多,否则不但不能提高查询速度,反而会造成系统对索引维护的复杂性,反而降低了性能。索引一般都是建立于比较小的数据类型字段上,如日期、数字型字段;如果是文本型字段,字段大小不应太大,一般字段大小不应该超过50,否则就要考虑建索引的必要性了;而备注、OLE对象字段则完全不允许建立索引。
3、刚入手时,我们可以通过实际中用到的报表来反推分析需要建立哪些表,以及表中大致有哪些字段。表一般主要有两大类,一类就是存放诸如产品、员工、客户信息的基础表,其它表中的数据都是由这些基本数据组合而来。产品、员工、客户这三个表相对于订单表,订单表就属于第二层的业务表,我们往这类表中填入数据的时候,大部分的数据都要从前面的基础表中取得。当然实际应用时根据业务流程的复杂程度,可能还会有第三层、第四层、第N层,这个只是一个泛化的分类方式。
4、除关系字段外的在基础表中已有的字段,不应该在其它表中重复出现。比如产品表中保存了所有的产品信息,这样在订单明细表中除了产品表的主键字段外不应该再有其它在产品表中已有的字段。在应用时如果需要在订单明细中显示出这些信息,我们可以通过关系建立查询,通过查询从产品表中取得相应数据。
5、对相关的表应该建立关系,并参照完整性,这样才能保证数据的有效性。关系的主要作用是消除数据冗余,以及方便建立查询。很多初学者对关系不理解或不重视,也就根本不去关注,造成了设计的查询过于杂乱,效率低下,而且建立的数据库中很容易出现无效和无用的数据。比如订单表和订单明细表之间,如果没有建立关系并参照完整性,当删除了订单表中的数据时,订单明细表中的相关记录依然存在,这就明显造成了无用数据。而如果我们在客户表中修改了客户的名称,而没有用关系中的参照完整性来确保数据完整,这样就可能会造成此客户的相关订单数据就从正常的查询中找不出来了。
对于使用可更新字段作为主键的,还应该在建立关系时选中级联更新。级联更新的作用就是,如果订单表中是通过客户名称和客户表建立关系的,当我们修改了客户表中的客户名称时,订单表中的客户名称就会被自动更改。至于级联删除功能,这个要根据情况而定,比如订单表和订单明细表就可以选中级联删除,这样我们删除订单表中的订单记录时,订单明细表中和其它相关的订单明细记录就会被自动删除。但对于像客户表和客户类别表这样的,就不要设置级联删除了,否则一旦删除了某个客户类别,所有该类别的客户资料都会删除,哭都没地方哭。因此级联删除功能对于比较重要的数据时尽量不要使用,确定要删除的话,可以以先删除相关子表中的记录,再删除主表中的记录的方式来进行。
为什么要一再强调数据的有效性?这个问题其实答案很明显。只有使用有效准确的数据才能从中分析出我们想要的信息,数据库的作用就是通过对数据的严格细分和有效性验证,来保证数据的准确和详尽,我们才能从中分析出更多想要的信息。比如我们要统计针对某个客户的订单销售额,则客户表和订单表之间是通过客户名称来关联的。这样一来如果我们在订单表中某条或某几条记录中将客户名称输错了或进行了修改,但我们并没有通过参照完整性去维护数据的有效性,表中的客户名称和我们统计时输入的做为查询条件的客户名称不匹配,最终统计出来的销售额自然也就是根本不正确,我们得不到正确的信息。类似这样的情况,我们不但不会因为使用数据库提升工作效率和方便管理,反而会对我们的工作造成误导,甚至可能因此造成损失。
6、对于数据的有效性验证应该尽量交给数据库引擎去处理。也就是在建表的时候就应该尽量设计好,而不是在窗体中通过代码去处理,后者的有效性是不容易保证的。
把数据库验证交给数据库引擎去处理,我们就可以省去很多重复的工作,只需要捕获相应的错误就并对用户进行提示,以及做出相应的处理就行了。否则如果全都放在窗体中去用代码进行每一项有效性验证的话,将是一个累死人的活儿。在表这一层次进行有效性验证是最有效也是最可靠的方式,不会产生写代码时没有考虑周全或不可预知的原因而造成的数据非正常更新、插入、删除等情况。
在字段的有效性规则中我们可以使用所有的能在Access中使用的逻辑条件运算符,如=、>、>=、<、<=、Like、In、Between…And等。除了那种跨字段的有效性验证(如交货日期不能早于下单日期)以外,我们几乎可以进行基于单个字段的所有验证。
7、字段应当尽量使用最小的、最适合的数据类型和字段大小。如产品数量字段就应该使用整型或长整型的数据类型,而不是去用单精度、双精度的数据类型;而像员工表中的员工姓名一般不可能超过10个字符(当然某些国家或民族的人的名字念一遍要歇几次气的那种不算_,我们这里说的只是中国人的名字),所以我们就没有必要把字段大小设成50或255,这样做会浪费存储空间和降低性能。而且当我们要对数据进行计算统计排序等处理的时候,也必须使用正确的数据类型才行,每种数据类型的比较计算方式是不一样的,比如如果是数字,我们想通过排序得出的结果肯定是从大到小排列,或从从小到到排列,但如果字段的数据类型被设成了文本型,它就只会按照文本的排序方式进行,像1后面就会是10而不是2。
(注:并不一定就是越小的数据类型效率越高,也存在例外,在Access中运算效率最高的数据类型是整型、长整型、货币型,这几种由于在应用中使用的频率最高,计算机系统中都对它们做过优化,所以反而比更小的字节型数据运算效率高)
8、表只应该用来存储数据,而不应该用来输入或编辑数据。除非是在开发阶段,否则所有的数据编辑工作都应该在窗体中进行。在开发完成后,不光是表,其它的Access数据库对象都不应该直接向最终用户显露展示,所有的操作都应该通过窗体来进行交互完成。

发布了10 篇原创文章 · 获赞 8 · 访问量 3832

猜你喜欢

转载自blog.csdn.net/weiisiceman/article/details/89318789
今日推荐