1.标识域为了在内存对象和数据库行之间维护标识而在对象内保存的一个数据库标识域。关系数据库通过使用键尤其是主键来区分数据行。然而,内存对象不需要这样一个键,因为对象系统能够保证正确的身份确认(在C++中是直接用原始内存的位置)。在数据库中读取数据非常方便,但是为了顺序写回这些数据,需要把数据库和内存对象系统联系在一起。本质上,标识域是非常简单的。你要做的所有工作只是将关系数据库表的主键存储在对象的域中。1.工作机制1.选择你的键第一个问题就是在数据库中应该选择什么样的键。首要问题是究竟使用有意义的键还是无意义的键。有意义的键类似于用来鉴别个人身份的社会保险号(SSN)。无意义的键本质上是数据库构造的一个并不打算供人使用的随机数。下一个问题是简单键和组合键。一个简单键只使用一个数据库域;一个组合键则使用多个数据库域。使用组合键的好处在于:当一个表与另外一个表上下文相关的时候它经常更易于使用。你必须选择键的类型。对键所进行的最常见操作是相等性检查,所以通常需要选择一个能快速进行相等操作的类型。另外一个重要的操作是得到下一个键。因此长整数型通常是最好的选择。键可以在表中唯一,也可以在数据库中唯一。2.对象内标识域的表示形式上最简单的标识域是与数据库中的键匹配的域。组合键的问题就要多一点。处理这种类型的最好办法是建立一个键类。一个普通的键类可以存储对应于组合键元素的一个序列。键对象的关键行为是相等判断。3.取得新键创建一个对象需要一个键。有三种选择:数据库自动生成,使用GUID或者自己创建一个。最通用的自动生成方法是声明一个自动生成域,无论什么时候插入一行数据,这个域都会递增到一个新值。这种策略的问题在于难以确定为键生成的是什么值。还有一种办法就是用数据库计数器。GUID(全局唯一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成GUID的API。生成算法是,用到了以太网卡的地址,纳秒级时间,芯片ID码和许多可能的数字。这样得到的结果数字完全唯一,因此是安全的键,GUID的唯一缺陷在于生成的结果串会比较大。最后一个选项是自己来产生键值。对小系统的一个简单例子就是用sql的max函数来进行表扫描,最大值加1。可惜这样做会锁表。更好的办法是使用独立的键表。典型的键表有2列:列名和下一个有效值。2.使用时机在内存对象与数据库行之间存在映射关系的时候使用标识域。这通常是在使用领域模型或者行数据入口的情况下。如果使用事务脚本,表模块或者表数据入口,就不需要这种映射。2.外键映射把对象间的关联映射到表间的外键引用。对象可以通过对象引用来互相直接访问。1.运行机制显然这个问题的关键就是标识域。每一个对象都包含来自相应数据库表的数据库键。如果两个对象用一个关联关系联系起来,则这种关联关系可以由数据库中的一个外键来取代。2.使用时机外键映射适用于类间几乎所有的关联。最常见的不适用情况是多对多关联。外键是单值的,第一范式意味着不能在一个单值域内保存多个外键。在这种情况下,需要使用关联表映射。3.关联表映射把关联表保存为一个表,带有指向(由关联所连接的)表的外键。通过使用集合作为值域,对象可以很容易的处理多值域。关系数据库没有这种特性,它受到约束,必须只是单值域。当你映射一个一对多关联时,可以使用外键映射来处理这个问题,实际上是为关联关系的单值端使用一个外键。但是,一个多对多的关联关系就不能这么做,因为这种关系,已经没有单值端可以保持外键了。解决办法是一个很经典的方案:创建一个额外的表来记录这种关系。然后使用关联表映射来把多值域映射到这个链接表中。1.运行机制关联表映射的基本思想是使用一个链接表来保存这种关联关系。这个表仅仅含有2个互相关联的外键id,对于每一对相关联的对象,它都有一个数据行与之对应。关联表没有相对应的内存对象。因此,它也没有id。它的主键就是互相关联的链表表的主键的组合。简而言之,需从链接表中加载数据就需要两次查询。2.使用时机关联表映射的标准情况就是一个多对多的关联关系。4.依赖映射让一个类为部分类执行数据库映射。有些对象很自然的在其他对象的上下文中出现。无论什么时候一张潜在的唱片被加载或者被保存的时候,这张唱片上的曲目都有可能被加载或被保存。如果它们没有被数据库中的任何其他表所引用,那么就可以通过让唱片映射器来为曲目执行相关映射来简化映射过程。我们把这种映射看作是依赖映射。1.运行机制以来映射的基本思想是在数据库持久化时,数据库中的某个类(依赖着)依赖于其他类(所有者)。每个依赖者有且只有一个所有者。5.嵌入值把一个对象映射成另一个对象表的若干字段。嵌入值把一个对象的值映射成该对象的所有者记录中的字段。1.运行机制这种机制很简单。当所有者对象被加载或者保存时,依赖者对象也同时被保存或者加载。依赖者类将没有自己的持久方法,因为所有的持久工作都由所有者完成。可以把嵌入值看成是依赖映射的一种特殊情况。6.序列化LOB通过将多个对象序列化到一个大对象(LOB)中来保存一个对象图,并存储在一个数据库字段中。对象模型经常包含一些小对象组成的复杂图。这些结构中的很多信息并不是存在对象中,而是存在它们之间的链接关系中。把这些全部放进关系数据库中不是一件很容易的事。基本的方案非常简单---一个带有上级外键的组织结构表,但是这个方案进行处理时需要许多连接。1.运行机制有2种方法进行序列化:二进制形式(blob)或者文本字符形式(clob)。blob往往是最容易创建的,因为多数平台都包含了自动序列化对象图的能力。保存图是很容易的事情,仅仅需要在一个缓冲区中应用序列化,然后把这个缓存区保存到相应的域中。blob的好处在于易于编程,并且使用最小的空间。缺点就是数据库必须支持二进制数据类型,而且没有对象就不能重新构造对象图,因此偶然查看这个字段是很难理解其含义的。最严重的问题可能是版本问题。如果改变了部门类,可能就无法读出它以前的序列化部门,因为数据可以在数据库中保持相当长的一段时间。另外一个选择就是clob。在这种情况下,把部门图序列化到一个文本字符串中,让它带有你所需要的信息。文本字符串可以很容易就被查看数据行的人看懂,对偶然查看数据库是有帮助的。然后使用文本的方法会比较占用空间,并且需要为使用的文本格式创建自己ID解析器。clob还可能要比二进制序列化慢。clob的许多缺点都可以使用xml克服。xml解析器随处可见,所以不需要自己写。并且xml是一种广泛的使用标准,所以当某些工具可以用来进一步操作时,你可以充分利用这些工具。xml不能解决的问题是空间问题。实际上它使空间问题更加严重,因为它是一种非常冗长的格式。解决这个问题的办法之一是使用压缩的xml格式作为blob,当然这样会失去可读性。2.使用时机序列化的lob还是用的比较少。xml使它更有吸引力,因为它遵从一种易于实现的文本化形式。它最大的缺点是不能使用sql查询得到它的结构。sql扩展能在一个字段中访问xml数据,但是它们仍然是不相同。7.单表继承将类的继承层次表示为一个单表,表中的各列代表不同类中的所有域。关系数据库并不支持继承,因此在把对象映射到数据库的时候必须考虑如何用关系数据库来表现继承结构。当映射到关系数据库的时候,我们要努力减少连接操作的数量,在多个表中处理继承结构时连接操作的数量会迅速上升。单表继承把一个继承结构中所有的类的所有域都映射到一个单表中。1.运行机制在这个继承方案中,我们使用一个表包含某个继承层次中所有类的所有数据。每个类负责把与之相关的数据保存在表的一行中。数据库中其他不相关的列留空。最基本的映射行为遵循继承映射器的通用模式。在往内存加载一个对象的时候,必须知道实例化哪个类来创建这个对象。为此,数据表中有一个域用来指示应该使用哪个类。8.类表继承用每个类对应一个表来表示类的继承层次。对象 --- 关系不匹配的一个显而易见的事实是关系数据库不支持继承。我们想要让数据库结构能很清楚的映射到对象,并且允许在继承结构的任何地方建立链接。类表继承通过给继承结构中的每一个类使用一个数据库表来支持这一点。9.具体表继承用每一个具体类对应一个表来表示类的继承层次。10.继承映射器用来组织可以处理继承层次的数据库映射器的一种结构。

12.企业应用架构模式 --- 对象-关系结构模式相关推荐

  1. 查询oracle模式对象信息,ORACLE 模式和模式对象

    模式和模式对象一个模式(schema)为模式对象(scehma object)的一个集合,每一个数据库用户对应一个模式.模式对象为直接引用数据库数据的逻辑结构,模式对象包含如表.视图.索引.聚集.序列 ...

  2. 2.设计模式中状态模式(对象的行为模式)(Python实现)

    1.什么是状态模式? 2.状态模式的设计思想 3.状态模式的代码框架模型 4.分别用框架模型和不用框架模型来处理下面的例子 5.模型说明 6. 应用场景 1.什么是状态模式? 如水一般,状态即事物所处 ...

  3. 第十一天-《企业应用架构模式》-对象-关系行为模式

    1. 工作单元 用于维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决.如下: 1)运行机制: 关键: 是提交时,决定要做什么.它打开一个事务,做所有的并发检查(使用悲观离线锁或乐观离线锁 ...

  4. 第十三天-企业应用架构模式-对象-关系元数据映射模式

    元数据映射 (Metadata Mapping) 查询对象 (Query Object) 资源库 (Repository)

  5. Bridge模式——对象结构型模式

    今天看了Bridge模式,对其进行简单的总结,并给出几篇通俗易懂的文章链接. (一)意图--将抽象部分和它的实现部分分离,使它们都可以独立地变化. 适用于从多维度描述的类型,拆解开来,使其能沿着各维度 ...

  6. Proxy 代理模式 对象结构型模式

    1.意图 为其它对象提供一种代理以控制对这个对象的访问. 2.别名 Surrogate 3.动机 对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化.我们考虑一个 ...

  7. [201004][企业应用架构模式][王怀民][周斌][译]

    [201004][企业应用架构模式][王怀民][周斌][译] 模式列表 引言 0.1 架构 0.2 企业应用 0.3 企业应用的种类 0.4 关于性能的考虑 0.5 模式 0.5.1 模式的结构 0. ...

  8. 企业应用架构模式学习笔记

    1.概述 2.分层 表现逻辑处理用户与软件间的交互.表现层的主要职责是向用户显示信息并把从用户那里获取的信息解释成领域层或数据源层上的各种动作. 数据源逻辑主要关注与其他系统的交互,这些系统将代表应用 ...

  9. 企业应用架构模式笔记

    1 企业应用模式概述 1.1 企业应用的模式 企业应用领域要解决的问题在某些方面要比做一个工具软件.或者一个电信通信软件等复杂的得多,比如纷杂的企业数据,各具特色的业务规则,变化莫测的用户需求.因此企 ...

  10. 结构模式--之--享元模式

    享元模式是对象的结构模式,享元模式以共享的方式高效地支持大量的细粒度对象.享元对象能做到共享的关键区分内蕴状态和外蕴状态. 一个内蕴状态是存储在享元对象内部的,并且是不会随着环境改变而有所不同,因此, ...

最新文章

  1. CPPUNIT的安装和编译
  2. ANDROID ASSET STUDIO
  3. linux7.3系统u盘制作,制作centos7U盘启动盘
  4. bash 脚本中激活conda环境_ubuntu18.10目标检测算法环境部署+开机自启动脚本创建screen下的web服务...
  5. nyoj117求逆序数 并归排序法
  6. 语言 ota_荣威RX5 PLUS使用最新的家族设计语言,给人更年轻时尚的感觉
  7. B程序员:讲述三年计算机学习辛酸史
  8. 如何面试一位前端工程师
  9. python爬虫工程师工作内容_爬虫岗位职责
  10. SpringMVC拦截器的使用
  11. 黑马微服务项目乐优商城全套
  12. java 进度条 百分比_java怎么让进度条带百分数
  13. 铁塔基站三相有功电能无线计量仪表外置互感器-安科瑞 顾月
  14. Matlab:实现Fra圆孔衍射仿真
  15. 十八掌教育_徐培成_Hadoop3.0-01.简介
  16. 精美viso制图(1)
  17. 多元函数泰勒级数展开_一元及多元函数的泰勒展开式
  18. python网球比赛模拟主持稿_主持人大赛模拟主持稿
  19. 此起彼伏的云计算峰会 我们到底听到了什么
  20. OCH1660全极高灵敏低功耗霍尔开关

热门文章

  1. ASP 读取Word文档内容简单示例
  2. 关于公司RIA的选型问题
  3. 你所知的最有价值(最有效)的思维方法是什么?
  4. elasticsearch sql插件 2.4及以下版本配置
  5. Spring IOC的三种主要注入方式?
  6. Intouch/ifix语音报警系统制作(4-自动发送邮件提醒)
  7. 学习下新塘M0芯片的下载方法
  8. C++编程基础一 28-编程练习一
  9. java学习--基础知识阶段性总结--JDK5新特性
  10. leetcode 148. Sort List ----- java