(三)建立可靠的关系

关系本身可以分为三类:一对一、一对多、多对多。而每种关系都是以专门的方式建立的,这里先简要回顾一下。

通过从“主”表中拷贝其主关键字并插入到“从属”表中,成为从属表的外关键字,这样建立一个一对一的关系。这是洋特殊的关系,在多数情况下,外关键字也是从属表的主关键字。

建立一对多的关系是这样的,拷贝“一”关系安放能够的表的主关键字,并将其插入到“多”方的表中,成为“多”方表的外关键字。

多对多关系的建立要创建一个关联表。这个关联表通过把关系中每一个表的主关键字拷贝出来形成新表的结构。这些字段通常会有这样两个截然不同的作用:这些字段组合在一起形成关联表的组合主关键字;同时这些字段各自又都作为一个外关键字。

为了保证数据库中表的关系是真正可靠的,还必须给每一个关系创建关系特征。定义这些特征就可以表明删除一条记录会发生什么样的后果、关系中表参与的类型、以及每一个表的参与程度。

在讨论关系特征之前,必须弄明白的一点是:要在引用的通用逻辑结构中描述这样的一些特征。这些特征非常重要,因为它们可以增强关系的完整性。然而,在不同的软件平台上其实现方法可能会有很大差别。使用前应该仔细查看软件所附带的文档,确定是否支持这些特征,如果支持,又是如何实现的。

1)  建立删除规则

删除规则确定了用户发出请求,要求从一对一关系中的“主”表或者从一对多关系中“一”关系方表中删除一个记录时所响应的动作。创建这样的规则可以防止出现“孤立”记录。(“孤立”记录是这样的一些记录,它们存在于一对一关系的“从属”表中,但在“主”表中却没有相应的记录对应,或者是在多对多关系的“多”关系方的表中存在而“一”方的表中却找不到相关的记录。)

可以给关系设置以下两种类型的删除规则:限制和级联。

    1.限制删除规则:若想要删除的记录在一对一关系的“从属”表中或一对多关系的“多”方表中还存在相关的记录,则不允许删除该记录。必须先删除这些相关的记录之后才能再删除该记录。

    2.级联删除规则:如果要删除某条记录,那么同时强制地把和它相关的一对一关系的“从属”表中的记录或一对多关系的“多”方表中的记录也一并删除。这类规则的使用要非常慎重,要不可能最后会把想要保留的记录都删掉了。

无论使用哪中类型的删除规则,都要仔细检查关系本身来决定到底使用哪种类型的规则更合适。可以通过一个简单的问题来帮助做出选择。首先,选择关系中的两个表并提出这样的问题:“是不是[主表或“一”关系方的表]中的一个记录删除时,在[从属表或关系中“多”方的表]中的相关记录同时也要被删掉?”

这个问题是根据一般情况提出的,可以理解它的基本假设前提。在实际应用中,把方括号中的内容用表名称代替。比如:“是不是Committees表中的一条记录删除时,Committee_Menbers表中的相关记录也要同时删除?”

如果答案是“不”,那么就用限制删除规则,否则就用级联删除规则。而最终,这个问题的答案主要还是取决于如何使用数据库中存储的数据。这也就是确保选择一个正确规则的原因。

2)设定参与类型

在建立两个表之间的关系时,每一个表都是以某种方式参与关系。一个表的参与类型指定了是否在另一个表添加某一记录之前必须在此表中有记录存在。有两种类型的参与方式。

    强制型——在添加任何记录到其它表之前,这个表中至少必须要有一条相关记录。

    可选型——在其他表添加记录之前并没有特别要求是否这个表必须包含相关记录。

两个表的参与类型的选择主要还是卡年组织的逻辑事务的行为。

例如,一个公司有好几个部门,公司的数据库中有一个Employees表,一个Departments表,一个Department_Employees表。其中Department_Employees表是一个关联表,允许把许多雇员和一个部门关联起来。

在最近一次部门调整上,要将一部分职员分配到一个新的部门Research_Development部,现在问题就出来了:要先确保添加了这个新的部门到Departments表中,这样才能在Department_Employees表中给这个部门分配职员。设置Departments表的参与类型为强制型,设置Department_Employees表的参与类型为可选型,这样设置完成后,才能确保在Department_Employees表中给部门分配职员之前这个部门是已经在Departments表中先建立好了的。

参考删除规则,仔细分析每一个关系并确定其中的每一个表的合适的参与类型。

3)设置参与程度级别

在确定了每一个表是如何参与到关系中来的,接着就必须指出每一个表的参与是什么样的程度级别。这可以通过确定一个表中的记录和另一个表中某一单个记录相关联的最大最小数目来实现。这个过程也可以成为确定表的参与级别。参与级别用两个数字来描述,这两个数字用圆括号圈起来,中间用逗号隔开。第一个数字表示的是最小的关联记录数,后一个数字表示的就是最多能关联的记录数目。例如,这样的一个参与级别(1,12)就表示能关联的最小记录数是1,最大数是12。

数据库中各个表的参与级别的选择确定,很大程度上依赖于数据使用和查看的方式。同其他关系特征一样,要对关系仔细研究,才能确定每个表的合适的参与级别。

转载于:https://www.cnblogs.com/PandaBamboo/archive/2012/09/29/2708374.html

如何保证数据库结构的合理性(三、建立可靠的关系)相关推荐

  1. navicat premium 链接postgresql 无法加载表_POSTGRESQL 数据库结构体系 ||| 东来西去 三个角度看...

    POSTGRESQL 的数据库体系结构是了解POSTGRESQL 数据库的整体概念的一个开始,而数据库的结构体系这个词有点大,所以这里从三个角度出发来看POSTGRESQL 结构 1  从数据库的使用 ...

  2. HubbleDotNet 开源全文搜索数据库项目--为数据库现有表或视图建立全文索引(三) 多表关联全文索引模式...

    关系型数据库中,多表关联是很常见的事情,HubbleDotNet 可以对部分情况的多表关联形式建立关联的全文索引,这样用户就不需要专门建一个大表 来解决多表关联时的全文索引问题. 下面以 为数据库现有 ...

  3. 在Delphi中动态建立数据库结构

    在Delphi中动态建立数据库结构  刘军发 ----------------------------------------------------------------------------- ...

  4. 三、mysqld程序的运行原理及数据库结构

    mysqld程序的运行原理及数据库结构 三.mysqld程序的运行原理及数据库结构 数据库的逻辑结构 数据库的物理结构 1. 库的物理存储结构 2.表的物理存储结构 3 .表的段.区.页(16k)(了 ...

  5. 【自然框架】元数据的数据库结构的详细说明和示例(三):项目与数据库字段的关联...

    [自然框架]PowerDesigner 格式的元数据的表结构 [自然框架]元数据的数据库结构的详细说明和示例(一):项目描述部分 [自然框架]元数据的数据库结构的详细说明和示例(二):数据库描述部分 ...

  6. 【解决方案 三十一】Navicat数据库结构同步

    最近在开发过程中遇到一个问题:刚经历了一个两个月的长迭代,导致测试库已经被改的面目全非了,最关键的是所有的变更语句都没有记录,这上线的时候怎么办啊,一百多张表呢,幸好组里的老程序猿说用过一个工具:Na ...

  7. 数据库调优策略:优化MySQL服务器、优化数据库结构、大表优化、隐藏索引对调优的帮助

    文章目录 1. 数据库调优的措施 1.1 调优的目标 1.2 定位调优问题 1.3 调优的维度和步骤 2. 优化MySQL服务器 2.1 优化服务器硬件 2.2 优化MySQL的参数 3. 优化数据库 ...

  8. MongoDB(芒果数据库)学习(三)——Mongoose搭建及运用(Schemas、Model、Document)

    MongoDB(芒果数据库)学习(三)---Mongoose搭建以及基础 一.mongoose前言 mongoose的官方网站:https://mongoosejs.com/ 简介: 之前我们通过sh ...

  9. SQL Server数据库结构

    SQL Server数据库结构和管理 数据库物理存储结构 数据库文件和文件组 主数据库文件(Primary Database File):是数据库的起点,可以指向数据库中文件的其它部分.每个数据库都有 ...

  10. JAVA实现数据库编程第三章_[数据库]使用Java实现数据库编程—03 第三章 高级查询(一)...

    [数据库]使用Java实现数据库编程-03 第三章 高级查询(一) 0 2018-07-21 03:01:10 1.修改表:(1)修改表名语法: ALTER TABLE RENAME [ TO ] : ...

最新文章

  1. C++11之基于范围的for循环
  2. debian 安装_如何在 Debian/Ubuntu 上手动安装安全更新? | Linux 中国
  3. php聊天功能逻辑原理,@xxx提及用户,这种功能的实现原理是怎样的?
  4. [JEEWX问题修复] JeeWX开源版2.3几处代码修改。
  5. UNIX标准化及实现之UNIX标准化、UNIX系统实现、标准和实现的关系以及ISO C标准头文件...
  6. 3904三极管是什么功能_什么是放大器。它有什么特性
  7. HTML5:web socket 和 web worker
  8. JVM 第五节:JVM 性能优化(上)
  9. Base64的编码原理
  10. 计算机毕业设计ssm高校物资捐赠管理系统0e45o系统+程序+源码+lw+远程部署
  11. mt4接入python_mt4 调用 api
  12. Java POI word常用方法 在Cell插入子表格
  13. python got an unexpected keyword argument
  14. fcpx快速添加字幕 | final cut pro导入fcpxml字幕文件与视频时间对不上?我用代码搞定了
  15. 查看微信公众号的二维码
  16. 企业如何提高客户转化率、复购率?用快鲸scrm效果突出
  17. 【12c】12c RMAN新特性之UNTIL AVAILABLE REDO--自动恢复到REDO终点的步骤简化
  18. 英语学习打卡day1
  19. C语言:到底是不是太胖了
  20. 码云果园:术后人群怎么吃水果

热门文章

  1. spark sql练习之join操作
  2. CukeTest新版本公测邀请-Windows应用自动化
  3. 如何用 Bash 创建一个二进制发布包
  4. 使用DAO模式开发宠物管理系统---hellokitty
  5. 微信蓝牙协议一:协议文档查阅方法和空中数据解析示例
  6. webstorm破解安装版本
  7. 微信公众平台开发中提示“该公众号提供的服务出现故障”问题解决
  8. idea java9以及以上 出现找不到class的情况
  9. UVa 11991 一道简单题
  10. 【转】WPF 窗体淡入淡出动画