点击上方蓝色字关注我们~

Access是一个基于数据库的开发设计工具,用它甚至可以开发出一整套的基于数据库的应用管理软件,所以使用时就必须遵循一定的开发设计流程,不像和它同属MicrosoftOffice办公系统软件的其它组件如Word、Excel等,可随时随意的打开新文件及输入数据,而必须进行一定的设计才能使用。

而表是Access中其它对象的根源,所有其它对象的设计开发都围绕表中的数据而进行,所以表的设计至关重要。

当开发进行到一定程度的时候,如果要对表的设计做出改动,和其相关的所有内容都需要同样进行修改,耗时耗力,甚至需要完全重新设计,由此可见初期正确建表的重要性

本文针对刚接触Access的初学者,讲述了一些建表的基本原理和规范,让大家少走一些弯路,尽量避免由于初期建表不正确造成的效率不高、后续开发困难,甚至因此造成需要全部推倒重来。

在实际应用中,尤其是刚接触Access的朋友,如果之前没有数据库的相关理论知识的话,就会感到很茫然,不知如何下手。最可能的情况就是凭感觉随意建表,结果造成完全达不到想要的结果或者效率不高,乃至后继的开发无以为继,甚至需要全部推倒重来。

建议大家找一些关系数据库理论方面的书看看,因为Access就是一个关系数据库。在这里由于篇幅所限,只能简单的说一下在Access中建表的一些基本原理规范及要点。

先声明一下两个名词的含义:表是列和行组成的,在Access中列被称为字段,行被称为记录(大部分关系数据库也都是这么叫的)。请记住这两个名词,以后会频繁的用到

构造数据库必须遵循一定的原理规则,而Access是一个关系数据库系统,所以使用Access就要遵循关系数据库的原理规则:范式(NormalForm)。

目前按照国际标准,一共有6种范式,除第一范式外,其它范式都是在满足前一范式的基础上而定义的,也就是说,符合第三范式的必定符合第二范式,符合第二范式的必定符合第一范式,以此类推。不过一般来说我们只要规范化到第三范式就足够了,其它范式不常用到,这里就不做解释和讨论了。

第一范式(1NF):数据库表中的字段都是单一属性,不可再分。

第一范式是最低的规范化要求,第一范式要求数据表不能存在重复的记录,即存在一个无重复主索引(主键)。第一范式的第二个要求是每个字段都不可再分,即已经分到最小,关系数据库的定义就决定了数据库满足这一条。主键不一定是某一个字段,也可以是多个字段的组合,不过一般都是设为一个字段,这样在使用时相对简单。主键要求它基于的字段不允许重复、不允许有空值。

满足第一范式的关系模式有许多不必要的重复值,并且在添加、修改、删除记录时可能会导致异常。为了避免数据冗余和消除异常,就引出了第二范式(2NF)。

第二范式(2NF):在第一范式的基础上,其它所有的字段都完全地依赖于主键字段。

为了说明问题现举一个例子来说明:有一个库房存储的库有四个字段(零件号码,仓库号码,零件数量,仓库地址),这个库符合第一范式,其中“零件号”和“仓库号”构成主关键字。但是因为“仓库地址”只完全依赖于“仓库号码”,即只依赖于主关键字的一部分,所以它不符合第二范式。

这样首先存在数据冗余,因为仓库数量可能不多。其次,存在如果更改仓库地址时,如果漏改了某一记录,存在数据不一致性。再次,如果某个仓库的零件出完了,那么这个仓库地址就丢失了,即这种关系不允许存在某个仓库中不放零件的情况。

我们可以用投影分解的方法消除部分依赖的情况,而使关系达到第二范式的标准。方法是从关系中分解出新的表,是每个表中所有的非关键字都完全依赖于各自的主关键字。我们可以分解成两个表(零件号码,仓库号码,零件数量)和(仓库号码,仓库地址),这样就完全符合第二范式了。

第三范式(3NF):如果一个关系属于第二范式,且其它字段不传递依赖于主键,则它满足第三范式。

从第二范式中消除传递依赖,就是第三范式。比如有一个表(姓名,工资等级,工资额),其中姓名是关键字, 此关系符合第二范式,但是因为工资等级决定工资额,这就叫传递依赖,它不符合第三范式,我们同样可以使用投影分解的办法分解成两个表:(姓名,工资等级),(工资等级,工资额)。

以上就是关系数据库的最基本的三范式规则,只有从理论上理解了,才会更容易在实际应用中理出头绪。后面我们会再用一篇文章说一些要点和技巧。

爱我,请给我好看

vfp如何比较两张表的关键字重复_Access开发中建表的基本原理和规范(上)相关推荐

  1. SQL 将两张包含相同字段和不同字段的表数据合并成一张表

    此为SQL案例:将两张具备相同字段,有一部分字段不相同的两张表获取查询结果为整合之后的. 两张表 table1 table2 我想要将两者的数据进行合并达到如下的效果: 这里限制条件有两个分别是dat ...

  2. 不用函数,教你快速查找两张表格中的重复内容。

    hello,小伙伴们 想必,屏幕前的你,又是因为excel表格所困,今天呢教大家,如何快速在两张大表格里查找重复内容,今天的素材呢为了方便大家查看和理解使用方法,小编简单为大家制作了一个表格,(仅供参 ...

  3. java表单防重复提交_防止表单重复提交的解决方案整理

    用户在操作表单Post数据时往往会出现表单数据重复提交的问题,尤其在Web开发中此类问题比较常见.刷新页面,后退操作以前的页面,单机多次按钮都会导致数据重复提交.此类问题是因为浏览器重复提交HTTP请 ...

  4. mybatis中 查询两张表,结果如果用resultMap接收,当两张表字段有重复的时候,如果不对字段加以区分,resultMap出来的值是空的

    所以要写清楚需要哪张表里的字段,这样mybatis就可以取到值了

  5. python表单防重复提交_防止表单重复提交的几种策略

    表单重复提交是在多用户Web应用中最常见.带来很多麻烦的一个问题.有很多的应用场景都会遇到重复提交问题,比如: 点击提交按钮两次. 点击刷新按钮. 使用浏览器后退按钮重复之前的操作,导致重复提交表单. ...

  6. opencv 叠加两张图_「干货」教你如何用OpenCV快速寻找图像差异处

    如何使用结构相似性指数(SSIM)将两个图像与Python进行比较. 使用这种方法,我们能够轻松确定两个图像是否相同或由于轻微的图像处理,压缩伪像或有目的的篡改而产生差异. 今天我们将扩展SSIM方法 ...

  7. Oracle 对比两张表的数据是否一致

    使用 minus 关键字(minus:差别,缺少) 有两张表CHECK_CITY_1和CHECK_CITY_2,现在要互相对比一下,两个表数据的差异,(即A中有哪些B里没有,B中有哪些A中没有) se ...

  8. MySQL 两张表数据合并

    有一个需求, 需要从数据库中导出两张表的数据到同一个excel中 鉴于是临时的业务需求, 直接使用Navicat 进行查询并导出数据. 数据涉及到三张表 CREATE TABLE `bigdata_q ...

  9. 如何删除有外键关系的两张表的数据

    文章目录 外键的定义 如何删除外键关系的两张表(父表 子表)的数据 方式一 方式二 两张表互为外键约束,删除任何一张表都会出错 为了保证数据完整 ,有一种方式就是两张表设置外键foreign key. ...

最新文章

  1. WPF编程,TextBlock中的文字修饰线(上划线,中划线,基线与下划线)的使用方法。...
  2. STM32的ADC笔记
  3. 值引用和引用问题分析
  4. 再来说说我喜欢的 Dotnet 5.0 C# 9
  5. 查看openssh版本_新版的Reveal如何查看越狱手机APP
  6. 基于matlab的排队系统仿真
  7. 淘宝订单API接口获取订单
  8. python类takes no arguments_Python中的学习类出现的object() takes no parameters问题
  9. 常德职业技术学院2018级新生军政训练总结表彰大会隆重召开
  10. 崩溃边缘 on No getter method for property
  11. 数字华容道java_从零开发HarmonyOS(鸿蒙)手机小游戏——数字华容道
  12. 为什么体适能一直显示服务器,一种体适能检测方法及系统
  13. Win10卸载OneDrive
  14. html输入框密码颜色,css解决浏览器输入框记住账号密码后的背景色
  15. oracle导出一半报1046,Oracle 数据库1046事件
  16. 无人机——开源飞控简介
  17. 环境工程原理知识点总结
  18. CenturyLink将在新加坡设立安全运营中心
  19. 基于Gabor滤波器的指纹图像增强处理算法matlab仿真
  20. Camtasia Studio 9录制高清、超清视频教程

热门文章

  1. Linux之Ansible入门用法(实验解析)
  2. 二叉搜索树与双向链表
  3. 1108File Space Bitmap Block损坏能修复吗2
  4. netstat 详解
  5. 转:Ogre的MaterialSystem分析
  6. HDU-1569 方格取数(2) 最小割最大流
  7. C#使用Tesseract OCR 解析验证码
  8. SQL Server DATEDIFF() 函数(SQL计算时间差)
  9. mysql 迁移表时忽略索引_Mysql迁移新环境索引损坏
  10. sql count(1) count(*)区别_PostgreSQL的count(1)真的比count(*)快么?