免费智能真题库 > 历年试卷 > 软件设计师 > 2015年下半年 软件设计师 上午试卷 综合知识
  第45题      
  知识点:   用户界面   设计模式   实例   数据模型
  关键词:   对象   接口   设计模式   实例   数据模型   用户界面   子类   数据        章/节:   计算机软件知识       

 
(45)设计模式能够动态地给一个对象添加一些额外的职责而无需修改此对象的结构;(46)设计模式定义一个用于创建对象的接口,让子类决定实例化哪一个类;欲使一个后端数据模型能够被多个前端用户界面连接,采用(47)模式最适合。
 
 
  A.  组合(Composite)
 
  B.  外观(Facade)
 
  C.  享元(Flyweight)
 
  D.  装饰器(Decorator)
 
 
 

 
  第24题    2016年下半年  
   14%
假设某计算机系统中只有一个CPU、一台输入设备和一台输出设备,若系统中有四个作业T1、T2、T3和T4,系统采用优先级调度,且T1的优..
  第26题    2012年下半年  
   13%
某计算机系统中有一个CPU、一台输入设备和一台输出设备,假设系统中有三个作业Tl、T2和T3,系统采用优先级调度,且T1的优先级>..
  第25题    2016年下半年  
   14%
假设某计算机系统中只有一个CPU、一台输入设备和一台输出设备,若系统中有四个作业T1、T2、T3和T4,系统采用优先级调度,且T1的优..
   知识点讲解    
   · 用户界面    · 设计模式    · 实例    · 数据模型
 
       用户界面
        用户界面是计算机中实现用户与计算机通信的软件和硬件部分的总称。用户界面也称为用户接口或人机界面。
               控制面板式用户界面
               计算机发展早期,用户通过控制台开关、板键或穿孔纸带向计算机送入命令或数据,而计算机通过指示灯及打印机输出运行情况或结果。这种界面的特点是人去适应计算机,现在看来是十分笨拙的。
               字符用户界面
               字符用户界面是基于字符型的。用户通过键盘或其他输入设备输入字符,由显示器或打印机输出字符。字符用户界面的优点是功能强、灵活性好、屏幕开销少;缺点是操作步骤繁琐,学会操作较费时。
               图形用户界面
               随着文字、图形、声音、图像等多媒体技术的出现,各种图形用户界面应运而生,用户既可使用传统的字符,也可以使用图形、图像和声音同计算机进行交互,操作更为自然、更加方便,多媒体技术进一步推广、发展与完善。现代界面的关键技术是超文本。超文本的"超"体现在它不仅包括文本,还包括图像、音频、视频等多媒体信息,即将文本的概念扩充到超文本,超文本的最大特点是具有指向性。
               新一代用户界面
               多媒体、多通道及智能化是新一代用户界面的技术支持。新的、更加自然的交互技术,将为用户提供更方便的输入技术。计算机将通过多种感知通道来理解用户的意图,实现用户的要求;计算机不仅以二维屏幕向用户输出,而且能以真实感的计算机仿真环境向用户提供真实的体验。
 
       设计模式
        “每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。设计模式的核心在于提供了相关问题的解决方案。
        设计模式一般有如下4个要素。
        (1)模式名称(pattern name)。模式名称应具有实际的含义,能反映模式的适用性和意图。
        (2)问题(problem)。描述了应该在何时使用模式,解释了设计问题和问题存在的前因后果。可能描述了特定的设计问题,如怎样用对象表示算法等;也可能描述了导致不灵活设计的类或对象结构。有时候,问题部分会包括使用模式必须满足的一系列先决条件。
        (3)解决方案(solution)。描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。解决方案并不描述一个特定的具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。
        (4)效果(consequences)。描述了模式应用的效果及使用模式应权衡的问题。因为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩充性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。
        设计模式确定了所包含的类和实例,它们的角色、协作方式以及职责分配。每一个设计模式都集中于一个特定的面向对象设计问题或设计要点,描述了什么时候使用它,在另一些设计约束条件下是否还能使用,以及使用的效果和如何取舍。按照设计模式的目的可以分为创建型、结构型和行为型三大类,如下表所示。
        
        设计模式分类
               创建型设计模式
               创建型模式与对象的创建有关,抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。
               创建型模式包括面向类和面向对象两种。Factory Method(工厂方法)定义一个用于创建对象的接口,让子类决定实例化哪一个类。Abstract Factory(抽象工厂)提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。Builder(生成器)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。Factory Method使一个类的实例化延迟到其子类。Prototype(原型)用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。Singleton(单例)模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。
               下面以抽象工厂模式和单例模式为例进行说明。
                      Abstract Factory(抽象工厂)
                      (1)意图。提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
                      (2)结构。抽象工厂模式的结构如下图所示。
                      
                      抽象工厂模式结构图
                      其中:
                      .AbstractFactory声明一个创建抽象产品对象的操作接口。
                      .ConcreteFactory实现创建具体产品对象的操作。
                      .AbstractProduct为一类产品对象声明一个接口。
                      .ConcreteProduct定义一个将被相应的具体工厂创建的产品对象,实现AbstractProduct接口。
                      .Client仅使用由AbstractFactory和AbstractProduct类声明的接口。
                      (3)适用性。Abstract Factory模式适用于:
                      .一个系统要独立于它的产品的创建、组合和表示时。
                      .一个系统要由多个产品系列中的一个来配置时。
                      .当要强调一系列相关的产品对象的设计以便进行联合使用时。
                      .当提供一个产品类库,只想显示它们的接口而不是实现时。
                      Singleton(单例)
                      (1)意图。保证一个类仅有一个实例,并提供一个访问它的全局访问点。
                      (2)结构。单例模式的结构如下图所示。
                      
                      单例模式结构图
                      其中:Singleton指定一个Instance操作,允许客户访问它的唯一实例,Instance是一个类操作;可能负责创建它自己的唯一实例。
                      (3)适用性。Singleton模式适用于:
                      .当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
                      .当这个唯一实例应该是通过子类化可扩展的,并且客户无须更改代码就能使用一个扩展的实例时。
               结构型设计模式
               结构型模式处理类或对象的组合,涉及如何组合类和对象以获得更大的结构。结构型类模式采用继承机制来组合接口或实现。一个简单的例子是采用多重继承方法将两个以上的类组合成一个类,结果这个类包含了所有父类的性质。这一模式尤其有助于多个独立开发的类库协同工作。其中一个例子是类形式的Adapter(适配器)模式。一般来说,适配器使得一个接口与其他接口兼容,从而给出了多个不同接口的统一抽象。为此,类Adapter对一个adaptee类进行私有继承。这样,适配器就可以用adaptee的接口表示它的接口。对象Adapter依赖于对象组合。
               下面以适配器模式和代理模式为例进行说明。
                      Adapter(适配器)模式
                      (1)意图。将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
                      
                      类适配器结构图
                      (2)结构。类适配器使用多重继承对一个接口与另一个接口进行匹配,其结构如上图所示。对象适配器依赖于对象组合,其结构如下图所示。
                      
                      对象适配器结构图
                      其中:
                      .Target定义Client使用的与特定领域相关的接口。
                      .Client与符合Target接口的对象协同。
                      .Adaptee定义一个已经存在的接口,这个接口需要适配。
                      .Adapter对Adaptee的接口与Target接口进行适配。
                      (3)适用性。Adapter模式适用于:
                      .想使用一个已经存在的类,而它的接口不符合要求。
                      .想创建一个可以服用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
                      .(仅适用于对象Adapter)想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
                      Proxy(代理)模式
                      (1)意图。为其他对象提供一种代理以控制对这个对象的访问。
                      (2)结构。代理模式的结构如下图所示。
                      
                      代理模式结构图
                      其中:
                      .Proxy保存一个引用使得代理可以访问实体;提供一个与Subject的接口相同的接口,使代理可以用来代替实体;控制对实体的存取,并可能负责创建和删除它;其他功能依赖于代理的类型:Remote Proxy负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求;Virtual Proxy可以缓存实体的附加信息,以便延迟对它的访问;Protection Proxy检查调用者是否具有实现一个请求所必需的访问权限。
                      .Subject定义RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
                      .RealSubject定义Proxy所代表的实体。
                      (3)适用性。Proxy模式适用于在需要比较通用和复杂的对象指针代替简单的指针的时候,常见情况有:
                      .远程代理(Remote Proxy)为一个对象在不同地址空间提供局部代表。
                      .虚代理(Virtual Proxy)根据需要创建开销很大的对象。
                      .保护代理(Protection Proxy)控制对原始对象的访问,用于对象应该有不同的访问权限的时候。
                      .智能引用(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以被自动释放;当第一次引用一个持久对象时,将它装入内存;在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。
                      结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法。因为可以在运行时刻改变对象组合关系,所以对象组合方式具有更大的灵活性,而这种机制用静态类组合是不可能实现的。
                      Composite(组合)模式将对象组合成树型结构以表示“部分—整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。它描述了如何构造一个类层次式结构,这一结构由两种类型的对象所对应的类构成。其中的组合对象使得用户可以组合基元对象以及其他的组合对象,从而形成任意复杂的结构。proxy(代理)模式为其他对象提供一种代理以控制对这个对象的访问,其中,proxy对象作为其他对象的一个方便的替代或占位符。它的使用可以有多种形式,例如可以在局部空间中代表一个远程地址空间中的对象,也可以表示一个要求被加载的较大的对象,还可以用来保护对敏感对象的访问。proxy模式还提供了对对象的一些特有性质的一定程度上的间接访问,从而可以限制、增强或修改这些性质。Flyweight(享元)模式运用共享技术有效地支持大量细粒度的对象,为了共享对象定义了一个结构。至少有两个原因要求对象共享:效率和一致性。Flyweight的对象共享机制主要强调对象的空间效率。使用很多对象的应用必须考虑每一个对象的开销。使用对象共享而不是进行对象复制,可以节省大量的空间资源。但是,仅当这些对象没有定义与上下文相关的状态时,它们才可以被共享。Flyweight的对象没有这样的状态。任何执行任务时需要的其他一些信息仅当需要时才传递过去。由于不存在与上下文相关的状态,因此Flyweight对象可以被自由地共享。
                      Facade(外观)模式为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,这个接口使得这一子系统更加容易使用。该模式描述了如何用单个对象表示整个子系统。模式中的facade用来表示一组对象,facade的职责是将消息转发给它所表示的对象。Bridge(桥接)模式将对象的抽象和其实现分离,从而可以独立地改变它们。
                      Decorator(装饰)模式描述了如何动态地为对象添加一些额外的职责。该模式采用递归方式组合对象,从而允许添加任意多的对象职责。例如,一个包含用户界面组件的Decorator对象可以将边框或阴影这样的装饰添加到该组件中,或者它可以将窗口滚动和缩放这样的功能添加到组件中。可以将一个Decorator对象嵌套在另外一个对象中,就可以很简单地增加两个装饰,添加其他的装饰也是如此。因此,每个Decorator对象必须与其组件的接口兼容并且保证将消息传递给它。Decorator模式在转发一条信息之前或之后都可以完成它的工作(例如绘制组件的边框)。许多结构型模式在某种程度上具有相关性。
               行为型设计模式
               行为模式对类或对象怎样交互和怎样分配职责进行描述,涉及算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻画了在运行时难以跟踪的复杂的控制流。它们将用户的注意力从控制流转移到对象间的联系方式上来。
               行为类模式使用继承机制在类间分派行为。本章包括两个这样的模式,其中Template Method(模板方法)较为简单和常用。Template Method是一个算法的抽象定义,它逐步地定义该算法,每一步调用一个抽象操作或一个原语操作,子类定义抽象操作以具体实现该算法。另一种行为类模式是Interpreter(解释器)模式,它将一个文法表示为一个类层次,并实现一个解释器作为这些类的实例上的一个操作。
               行为对象模式使用对象复合而不是继承。一些行为对象模式描述了一组对等的对象怎样相互协作以完成其中任一个对象都无法单独完成的任务。这里一个重要的问题是对等的对象。
               如何互相了解对方。对等对象可以保持显式的对对方的引用,但那会增加它们的耦合度。在极端情况下,每一个对象都要了解所有其他的对象。Mediator(中介者)模式用一个中介对象来封装一系列的对象交互,在对等对象间引入一个mediator对象以避免这种情况的出现。mediator提供了松耦合所需的间接性。
               Chain of Responsibility(责任链)使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。Chain of Responsibility模式提供更松的耦合,让用户通过一条候选对象链隐式地向一个对象发送请求。根据运行时刻情况任一候选者都可以响应相应的请求。候选者的数目是任意的,可以在运行时刻决定哪些候选者参与到链中。
               Observer(观察者)模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。典型的Observer的例子是Smalltalk中的模型/视图/控制器,其中一旦模型的状态发生变化,模型的所有视图都会得到通知。
               其他的行为对象模式常将行为封装在一个对象中并将请求指派给它。Strategy(策略)模式将算法封装在对象中,这样可以方便地指定和改变一个对象所使用的算法。Command(命令)模式将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。Memento(备忘录)模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便在以后可将该对象恢复到原先保存的状态。State(状态)模式封装一个对象的状态,使得对象在其内部状态改变时可改变它的行为,对象看起来似乎修改了它的类。Visitor(访问者)模式表示一个作用于某对象结构中的各元素的操作,使得在不改变各元素的类的前提下定义作用于这些元素的新操作。Visitor模式封装分布于多个类之间的行为。Iterator(迭代器)模式提供一种方法顺序访问一个聚合对象中的各个元素,且不需要暴露该对象的内部表示。Iterator模式抽象了访问和遍历一个集合中的对象的方式。
               下面以中介者模式和观察者模式为例进行说明。
                      Mediator(中介者)
                      (1)意图。用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
                      (2)结构。中介者模式的结构图如下图所示。
                      
                      中介者模式结构图
                      其中:
                      .Mediator(中介者)定义一个接口用于各同事(Colleague)对象通信。
                      .ConcreteMediator(具体中介者)通过协调各同事对象实现协作行为;了解并维护它的各个同事。
                      .Colleague class(同事类)知道它的中介者对象;每一个同事类对象在需要与其他同事通信的时候与它的中介者通信。
                      (3)适用性。Mediator模式适用于:
                      .一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。
                      .一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
                      .想定制一个分布在多个类中的行为,而又不想生成太多的子类。
                      Observer(观察者)
                      (1)意图。定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
                      (2)结构。观察者模式的结构图如下图所示。
                      
                      观察者模式结构图
                      其中:
                      .Subject(目标)知道它的观察者,可以有任意多个观察者观察同一个目标;提供注册和删除观察者对象的接口。
                      .Observer(观察者)为那些在目标发生改变时需获得通知的对象定义一个更新接口。
                      .ConcreteSubject(具体目标)将有关状态存入各ConcreteObserver对象;当它的状态发生改变时,向它的各个观察者发出通知。
                      .ConcreteObserver(具体观察者)维护一个指向ConcreteSubject对象的引用;存储有关状态,这些状态应与目标的状态保持一致;实现Observer的更新接口,以使自身状态与目标的状态保持一致。
                      (3)适用性。Observer模式适用于:
                      .当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用。
                      .当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变时。
                      .当一个对象必须通知其他对象,而它又不能假定其他对象是谁,即不希望这些对象是紧耦合的。
 
       实例
        某考务处理系统有如下功能:
        (1)对考生送来的报名单进行检查。
        (2)对合格的报名单进行检查。
        (3)对阅卷站送来的成绩清单进行检查,并根据考试中心指定的合格标准审定合格者。
        (4)制作考生通知单(内含成绩合格/不合格标志)送给考生。
        (5)按地区、年龄、文化程度、职业和考试级别等进行成绩分类统计和试题难度分析,产生统计分析表。
        该考务处理系统的分层数据流图如下图所示。
        
        考务处理系统分层数据流图
 
       数据模型
        1)信息结构与E-R方法
        (1)数据的3种范畴。数据需要进行认识、理解、整理、规范和加工,然后才能存放到数据库中。也就是说,数据从现实生活进入到数据库实际经历了若干个阶段。一般划分为3个阶段,也就是数据的3种范畴,即现实世界、信息世界、机器世界。
        ①现实世界。存在于人们头脑之外的客观世界,也就是客观存在并可以相区分的客观事物或抽象事物,称为实体。
        ②信息世界。客观事物必然在人们的头脑中产生反映,把这种反映称为信息。
        ③机器世界。对信息世界的信息进行数据化,数据化后的信息称之为数据。
        (2)E-R方法。我们需要对现实世界的信息结构进行描述,最常用的方法是实体-联系方法,即通常所说的E-R(Entity-Relationship)方法。E-R方法使用的工具称为E-R图,它所描述的现实世界的信息结构称为企业模式(Enterprise Schema),也把这种描述结果称为E-R模型。
        E-R图的3个要素是实体、属性以及实体和属性之间的联系。
        ①实体。在E-R图中用矩形框表示实体,把实体名写在方框内。
        ②属性。实体的属性用椭圆框表示,框内写上属性名,并用连线与相应的实体相连。这种画法有点麻烦,后来也有直接将属性名写在实体旁边,并对实体的标识属性标注下划线。
        ③联系。联系本身也有属性,联系是通过相关联的实体的有关属性体现出来的。实体之间的联系用菱形框表示,框内写上联系名,并用连线与有关的实体相连。实体之间联系的基本类型有一对一(1∶1)、一对多(1∶n)和多对多(mn)3种。
        实体之间的联系类型并不取决于实体本身,而是取决于现实世界的管理方法,或者说取决于语义,即同样两个实体,如果有不同的语义,则可以得到不同的联系类型。比如有仓库和器件两个实体,下面来讨论它们之间的联系。
        ①如果规定一个仓库只能存放一种器件,并且一种器件只能存放在一个仓库,这时仓库和器件之间的联系是一对一的。
        ②如果规定一个仓库可以存放多种器件,但是一种器件只能存放在一个仓库,这时仓库和器件之间的联系是一对多的。
        ③如果规定一个仓库可以存放多种器件,同时一种器件可以存放在多个仓库,这时仓库和器件之间的联系是多对多的。
        2)数据库系统的体系结构
        数据库系统的应用结构经历了集中式结构、文件服务器的网络结构到现在客户机/服务器网络结构以及分布式网络结构。
        (1)集中式数据库系统。集中式数据库系统,就是将数据以及数据的管理都集中在一台计算机上。这类数据库效率高,可靠性好,数据冗余少,数据独立性高。
        (2)客户机/服务器(C/S)数据库系统。在客户机/服务器数据库系统中,数据库服务器的平台与客户端无关,其数据库管理系统集中负责管理数据库服务器上的数据和资源,它向客户提供一个开放的使用环境,客户端的用户通过数据库接口访问数据库。客户端称为前台,服务器称为后台。前台的工作包括管理用户接口或界面、采集数据、向后台发出请求等;而后台负责管理外设、存取共享数据、响应前台请求并送回结果。客户端的应用程序和数据一般是用户自己专用的,而服务器的功能和数据是所有用户共享的。
        (3)分布式数据库系统。分布式数据库系统就是数据物理的分布存储在不同的计算机上,这些物理上分布存储的数据在逻辑上构成一个整体的数据库。也就是一个物理上分布于计算机网络的不同地点,而逻辑上又属于同一系统的数据集合。网络上每个地点的数据库都有自治能力,能够完成局部应用;同时每个地点的数据库又属于整个系统,通过网络也可以完成全局应用。
        3)传统的三大模型
        数据库中不仅要存放数据本身,还要存放数据与数据之间的联系,可以用不同的方法表示数据与数据之间的联系,把表示数据与数据之间联系的方法称为数据模型。传统的数据模型有层次数据模型、网络数据模型和关系数据模型。
        (1)层次数据模型。用树形结构来表示实体之间的联系的模型称为层次模型。支持层次模型的典型系统诞生于1970年前后,就是IBM公司的IMS(Information Management System)。构成层次模型的树是由节点和连线组成的,节点表示实体集(文件或记录型),连线表示相连两个实体之间的联系,这种联系只能是一对多的。通常把表示"一"的实体放在上方,称为父节点;而把表示"多"的实体放在下方,称为子节点。层次模型表示一对多的联系是直接而方便的。但由于层次模型有以下两点限制:
        ①有且仅有一个节点无父节点,这个节点即为树的根。
        ②其他节点有且仅有一个父节点。
        这样就使得多对多联系不能直接用层次模型表示,但是如果把多对多联系转换成一对多联系,又会出现一个子记录型有多个父记录型的结果,这同样不符合层次数据库的要求。解决的办法只有把它分解成两个层次型。层次数据模型或层次数据库是由若干层次型构成的,或者说它是一个层次型的集合。
        (2)网络数据模型。如果取消层次模型中的两点限制,即允许每一个节点可以有多个父节点,便形成了网络。用网络结构来表示实体之间联系的数据模型称为网络数据模型。网络模型和层次模型在本质上是一样的,从逻辑上看它们都是用连线表示实体之间的联系,用节点表示实体集;从物理上看,层次模型和网络模型都是用指针来实现两个文件之间的联系,其差别仅在于网络模型中的连线或指针更加复杂,更加纵横交错,从而使数据结构更复杂。在网络模型中同样使用父节点和子节点这样的术语,并且同样把父节点安排在子节点的上方。网络数据模型的典型代表是CODASYL系统。
        (3)关系数据模型。关系数据模型源于数学,它把数据看成二维表中的元素,而这个二维表就是关系。用关系(表格数据)表示实体和实体之间联系的模型称为关系数据模型。通俗地讲,关系就是一个二维表格,表格中的每一行称为一个元组,它相当于一个记录值,每一列是一个属性值集,列可以命名,称为属性名。这里的属性与前面讲到的实体属性(特征)或记录的字段意义相当。由此可见,关系是元组的集合,如果表格有n列,则称该关系是n元关系。关系应满足以下性质。
        ①表格中的每一列都是不可再分的基本属性。
        ②各列被指定一个相异的名字。
        ③各行相异,不允许重复。
        ④与行、列次序均无关。
        综合以上4点,可以说:一个关系是一个文件,该文件中的每个记录是唯一的,所有记录具有相同个数和类型的字段,也就是说,所有记录有同样的固定长度和格式。在关系数据模型中实体本身以及实体与实体之间的联系都用关系来表示,实体之间的联系不再通过指针来实现。
        对于用户,关系方法应该是很简单的,但是关系数据库管理系统本身是很复杂的。关系方法之所以对用户简单,是因为它把大量的困难转给了数据库管理系统。关系数据库管理系统一经投入使用,便逐步取代了层次数据库和网状数据库。现在耳闻目睹的数据库管理系统,全部都是关系数据库管理系统,像Sybase、Oracle、Informix、MS SQL Server、FoxPro、Access等。
        4)数据独立性和三层模式结构
        数据独立性是指应用程序与存储数据相互独立的特性。也就是当修改数据的组织方法和存储结构时,应用程序不用修改的特性。数据独立性又分为存储数据独立性和概念数据独立性。
        (1)存储数据独立性。以前所熟悉的计算机文件,都是真正在磁盘上存在的物理文件或存储文件,应用程序也是针对这样的文件而写的。在存储文件中,不仅存储了管理现实世界所需要的各种数据,还存储了大量为了管理文件本身所需要的辅助数据,如索引和指针等。为了使应用程序与这些索引和指针等分离开来,使之只关心管理现实世界所需要的各种数据本身,把程序分成两部分,一部分是应用程序或用户程序(User-Program),另一部分是存储子程序(Storage-Routine)。用户程序操作一个物理上并不存在的概念文件或逻辑文件,而实际操作则是交由存储子程序去操作存储文件来完成的。这时如果修改存储文件的组织方法或存储结构,将与用户程序无关,而存储子程序则可以做成通用的和商品化的程序。实际上,这里的存储子程序就是后来的数据库管理系统的数据存储子系统。概念文件只是"概念上"的,它实际上并不存在,可以把它看作存储文件的抽象。也可以假设概念文件只包含用户有用的数据,像指针那些辅助字段被屏蔽掉了。或者说,概念文件是用户存取存储文件的结构或框架。
        通过概念文件只需要关心文件中有哪些数据,至于数据是怎么存储的、还有哪些指针和索引都不用关心。显然这种两级方案给用户程序带来了存储数据独立性,即不管存储文件的存储方法和存储结构怎么改变,用户程序都能继续正确执行。
        存储数据独立性的最大好处是可以大大节省程序的维护代价。一般在一个大的系统中,会有很多用户程序操作存储文件,如果所有这些程序都通过存储子程序和概念文件完成它们的操作,那么当要改变存储文件的存储方法时,所有这些程序都不会受到影响。
        (2)概念数据独立性。每个用户程序并不一定使用概念文件中的全部数据字段,不同的用户程序只是从概念文件中抽取部分字段为自己所用。把从概念文件抽取的部分字段称为外部文件,这也为获得概念数据独立性奠定了基础。
        概念数据独立性也称为逻辑数据独立性,它是指当用户程序操作的概念文件有插入或删除字段的情况发生时(当然是通过存储文件),用户程序仍能正确执行的性质。当然,插入或删除的字段与这个用户程序是无关的,也就是说,它们不是这个用户程序使用的字段。
        (3)数据库的三层模式结构。不管是概念文件还是外部文件,它们都不真正含有数据,只是存取存储文件的结构或框架;概念文件是存储文件的抽象,而外部文件是概念文件的部分抽取。使用这种三层结构不仅可以使数据具有独立性,使数据和程序的代价大大降低,而且还可以使数据达到共享,使同一数据满足更多用户的不同需求。
        5)关系数据库
        (1)关系模型的基本概念。设D1,D2,…,Dn为任意集合,定义D1,D2, …,Dn的笛卡儿积为
        D1×D2×…×Dn={(d1,d2, …,dn)|diDii=1, 2, …,n}
        笛卡儿积D1×D2×…×Dn的任意一个子集称为D1,D2,…,Dn上的一个n元关系。
        可以把二元关系看成二维表,给表的每一列取个名字,称为属性,n元关系就有n个属性,属性的名字要唯一,其取值范围Dii=1, 2, …,n)称为值域。
        如果一个属性集的值能唯一标识一个关系的元组而又不含有多余的属性,则称该属性集为候选关键字。有时一个关系中有多个候选关键字,这时可以选择其中一个作为主关键字,简称关键字。每一个关系都有一个并且只有一个主关键字。
        如果一个属性集不是所在关系的关键字,但是是其他关系的关键字,则该属性集称为外部关键字。
        关系模式就是二维表的表框架或结构,它相当于文件结构或记录结构。
        关系模型是所有的关系模式、属性名和关键字的汇集,是模式描述的对象。
        对应于一个关系模型的所有关系的集合称为关系数据库。
        关系模型下的术语列举如下。
        ①属性:数据项(字段)。
        ②元组:记录(值)。
        ③关系:文件(值)。
        ④关系模式:记录类型(文件格式)。
        ⑤关系名:文件名(记录名)。
        ⑥数据库模式:概念模式。
        最后概括一下关系的性质。
        ①列是同质的,即每一列中的分量是同类型的数据,来自同一个值域。
        ②不同的列可以出自同一个值域,每一列称为属性,要给予不同的属性名。
        ③列的顺序是无关紧要的,即列的次序可以任意交换。
        ④元组不可以重复,即任意两个元组不能完全相同。
        ⑤行的顺序是无关紧要的,即行的次序可以任意交换。
        ⑥每一分量必须是不可分的最小数据项。
        ⑦每个关系都有一个主关键字唯一标识它的各个元组。
        (2)关系模式。关系数据库同样具有3层模式,即概念模式、存储模式和外部模式。关系概念模式主要包括对出现在数据库中的每个关系的说明,包括对关系名、属性名和属性的取值范围(类型)的说明。在关系数据模型中可以不说明关系与关系之间的联系(关系与关系之间的联系是通过连接字段实现的)。比如有以下的关系:
        花名册(学号,姓名,年龄)
        成绩单(学号,姓名,成绩)
        关系存储模式从原理上讲与其他类型数据库系统的存储模式没有什么不同,每个概念文件都对应一个存储文件。一般基于主关键字进行直接存取需要建立一个主索引(唯一索引),通过辅助关键字进行存取需要建立一个辅助索引(一般索引)。在关系存储模式中不用说明存储文件,存储文件的说明由关系数据库管理系统根据基本表(概念文件)的定义自动映射产生。所以,在关系存储模式中要说明的主要内容就是索引。
        关系外部模式的定义和其他类型数据库系统的外部模式一样,在关系数据库中外部文件被称为视图(View)。
        (3)关系代数。关系代数是对关系运算的总和。关系运算分为以下两类。
        ①传统的集合运算,这种运算将关系看作元组的集合。
        ②专门的关系运算。
        传统的集合运算是二目运算,设关系RS均是n元关系,且相应的属性值取自同一个值域,则可以定义并运算(∪)、交运算(∩)、差运算(-)以及前面讲的笛卡儿乘积。
        ①RS的并是集合,记为RS, RS={x|xRxS}。
        ②RS的交是集合,记为RS, RS={x|xRxS}。
        ③RS的差,或S关于R的相对补是集合,记为R-SR-S={x|xRx?S}。
        在关系代数中,有4种基本的专门关系运算,即选择(Select)、投影(Project)、自然连接(Join)和除法运算(Division)。
        ④选择运算是最简单的运算,它从指定的关系中选择某些元组形成一个新的关系,被选择的元组是用满足某个逻辑条件来指定,表示为σFR),其中σ是选择运算符,R是关系名,F是逻辑表达式。
        比如,对下表所示的订购单关系,选择职工号为E3的元组构成新的关系,可以有如下的选择运算:
        
        
        订购单关系表
        结果如下表所示。
        
        运算结果表
        ⑤投影运算是对指定的关系进行投影操作,根据该关系分两步产生一个新关系。首先选择指定的属性,形成一个可能含有重复行的表格,然后删除重复行形成新的关系,表示为πAR),其中π是投影运算符,A是被投影的属性或属性集。
        比如:对订购单关系选取职工号和供应商号两列组成新的关系,可以有以下投影运算:
        
        结果如下表所示。
        
        π运算结果表
        ⑥自然连接运算定义如下:当两个关系RS的某些列具有相同的属性名时,可利用这些同名属性列的相同值作为连接条件将两个关系连接起来,构成自然连接。在连接后的关系中,不仅含有RS不同的属性列,而且含有相同的属性列,其元组的数目由公共属性列中的相同值决定。
        设R是属性名为(A1,A2, …,Am, …,Ak1)的k1元关系,S是属性名为(A1,A2,…,Am, …,Bk2)的k2元关系,其中A1,A2, …,Am是同名属性列,进行自然连接的步骤如下:选出关系RS中属性A1,A2,…,Am完全相同的所有元组;对这些元组进行笛卡儿乘积;最后去掉重复属性。
        ⑦除法运算是指用一个m+n度的关系R除以一个n度关系S,运算结果生成一个m元的新关系。这里R的第m+i个属性和S的第i个属性(i=1, 2, …,n)必须是在相同的域上定义。如果把R的前m个属性看作一个组合属性x,后n个属性看成一个组合属性y,则S也可类似地看成一个组合属性y。这样以S中的y值来对R进行分组,当组中含有y值时,则组中的x值便构成了R除以S的一个元组。R除以S的数学表达式为
        R÷S=πaR)-πaaR×S-R]
        式中,a为关系R中除去与S关系相同的其余属性。
        6)关系数据库标准数据语言SQL
        查询是SQL(Structured Query Language,结构化查询语言)的重要组成部分但不是全部,其主要特点如下。
        ①SQL是一种一体化的语言,包括数据定义、数据查询、数据操纵和数据控制等方面的功能,它可以完成数据库活动中的全部工作。
        ②SQL是一种高度非过程化的语言,它没有必要一步步地告诉计算机"如何"去做,而只需要描述清楚用户要"做什么",SQL就可以将要求交给系统,自动完成全部工作。
        ③SQL非常简洁。虽然SQL功能很强,但它只有为数不多的几条命令。另外,SQL的语法也非常简单,它很接近自然语言(英语),因此容易学习、掌握。
        ④SQL可以直接以命令方式交互使用,也可以嵌入到程序设计语言中以程序方式使用。现在很多数据库应用开发工具,都将SQL直接融入自身的语言之中,使用起来更方便。这些使用方式为用户提供了灵活的选择余地。此外,尽管SQL的使用方式不同,但SQL的语法基本是一致的。
        (1)SQL的数据定义功能。SQL的数据定义功能包括数据库的定义、基本表的定义、视图的定义、存储过程的定义、规则的定义和索引的定义等。
        创建表的命令如下:
        
        修改表的命令如下:
        
        在SQL中,只允许以增加新的属性(ADD)和修改属性类型的长度(MODIFY)这两种方式修改表结构,不允许诸如更改属性名、删除属性等修改,这是从数据完整性的角度加以限制的。
        删除表的命令如下:
        
        建立索引的命令如下:
        
        索引分为两类,即唯一(UNIQUE)索引和普通索引。默认是以升序(ASC)方式建立索引,如果需要也可以按降序(DESC)方式建立索引。
        删除索引的命令如下:
        
        建立视图的命令如下:
        
        其中可以是任意的SELECT查询,它说明和限定了视图中的数据。删除视图的命令格式如下:
        
        (2)SQL的数据查询功能。SQL的核心是查询。SQL的查询命令也称为SELECT命令,其基本形式由SELECT-FROM-WHERE查询块组成,多个查询块可以嵌套执行。SELECT命令的语法如下:
        
        具体解释如下。
        .SELECT说明要查询的数据,"*"表示要指定表中的全部数据,DISTINCT说明要去掉重复元组。
        .FROM说明要查询的数据来自哪个(些)表,可以基于单个表或多个表进行查询。
        .WHERE说明查询条件,即选择元组的条件。
        .GROUP BY短语用于对查询结果进行分组,可以利用它进行分组汇总。
        .HAVING短语必须跟随GROUP BY使用,它用来限定分组必须满足的条件。
        .ORDER BY短语用来对查询的结果进行排序。
        .COMPUTE短语可以进行带明细的分组汇总。
        查询中有以下几个特殊运算符。
        .BETWEEN…AND:表示在……和……之间。
        .LIKE:字符串匹配运算符,可用通配符"*"表示0个或多个字符,"?"表示一个字符。
        .NOT:否定运算符。另外SQL中"不等于"用"!="表示。
        .ANY和SOME:在进行比较运算时只要子查询中有一行能使结果为真,则结果就为真;而ALL则要求子查询行中所有行都使结果为真时,结果才为真。
        .EXISTS或NOT EXISTS:用来检查在子查询中是否有结果返回。
        SQL不仅具有一般的检索能力,而且还有计算方式的检索。用于计算检索的函数有以下几种。
        .COUNT:计数。
        .SUM:求和。
        .AVG:计算平均值。
        .MAX:求最大值。
        .MIN:求最小值。
        (3)SQL的数据操作功能。SQL的操作功能是指对数据库中数据的操作,主要包括数据的插入、更新和删除。
        插入的命令如下:
        
        更新的命令如下:
        
        删除的命令如下:
        
        (4)SQL的数据控制功能。SQL的数据控制功能主要是指对数据库中数据的安全控制和管理,即对数据的安全提供保护,这主要表现在对数据使用的授权(GRANT)和收回授权(REVOKE)。每个用户对自己拥有的资源可以有任意的操作权限,同时也可以把其中的一部分权限授予他人。
        SQL的授权命令如下:
        
        权限可以是SELECT、INSERT、DELETE、UPDATE(<列名>[;<列名>]、ALTER和INDEX等,也可用ALL表示所有权限。
        收回权限的命令如下:
        
   题号导航      2015年下半年 软件设计师 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第45题    在手机中做本题