关系数据库模型在理论上主要解决的是消除数据冗余的问题。关系模型的数学基础是所谓的集合论,而集合的基本含义正是一组具有某种原子性的互不相同的元素。面向对象技术是对相关性进行局域化的一种手段(相关的数据和操作聚集到同一对象名义下),在这一局域化过程中,相同的元素被识别出来,成为独立的对象。从某种意义上说,关系模型与对象模型是殊途同归的过程,是从不同侧面对同一事物的反映。关系模型中,我们关注的重点是元素组成的集合,允许的连接关系定义在集合之上。而在对象模型中,我们关注的首先是横向关联的实体,实体之间具有稳定的联系。在概念层面上,从对象模型映射到一种关系存储模型只是一个分组问题。为了断开实体之间的直接联系,关系模型创造了一个id字段,而对象模型并不是需要显式id的。在关系模型中,关联并不是通过某种存在的结构来表达的(一个实体持有另一个实体的指针,拥有直接联系),而是将直接关联问题弱化为某种计算过程,我们必须检查id的值(不是某种直接的存在性),通过某种运算过程才能重新发现数据之间的关联。
通过id(伴随一个匹配计算过程)来进行间接关联对于保证模型的一致性是非常关键的。在ORM中恢复了对象的强关联其实会造成很多潜在的复杂性。例如为了维护对象层面结构的一致性,在更新父子关系的时候,我们需要同时调用 child.setParent(parent); parent.getChildren().remove(child); 当关联结构更加复杂的时候,这里所需要的维护工作是随之增加的。不过,在ORM中,对象的形态是暂时性的。在ORM的一次session的操作过程中,对于对象状态的修改可以是不一致的。例如我们可以只调用child.setParent(parent); 而不需要同时 parent.getChilren().remove(child); 只要我们在此次session操作中,不需要同时用到parent.getChildren(). 这种关联的暂时性对于很多ORM应用来说是必不可少的。
对象模型中可以直接表达的结构关系比关系模型要丰富一些,例如继承关系,many-to-many, one-to-list等。但是所有这些都不是真正本质性的差异。抛弃概念诠释,基类与众多派生类之间的关系基本上可以等价于一组one-to-one关系。而当关联对象本身的重要性凸现出来的时候,当我们无法把它约化为对象上的一些附属特性的时候(例如数组的下标),我们必然要建立相应的关联对象,而这正对应于关系模型中的中间关联表。中间关联表上增加额外的字段是一个自然的扩展过程,而对象模型上做这样的扩充往往表现为形态上的重大的不兼容的变化,例如从getManyToManyEntity() -> getToManyRelation(), 这实际上意味着这里的对象形式是偶然的,简化的。
在原始的关系数据库模型中,所有的表之间的地位是平等的,所有字段之间的地位是平等的(主键和外键在参与数据关联时和其他字段的处理方式一致)。这种概念上的均一性和普遍性往往被认为是理论的优美之处。但是现实世界是复杂的,发展的方向就是逐步识别出不同之处,并找出自然的表达形式将这些不同表达出来。均匀的关系模型是对称性最高的,最简化的模型。在面对物理约束时,它隐含的假设是集合之间很少发生相互作用,单表(表单到数据表之间的映射)和主从表是最广泛的情况。试着想象一下关系模型,在思维中一般我们只能看到两个数据表,当考虑到多个表的时候,因为这些表之间没有明确的可区分性,因此它们的意象是模糊的。只有明确意识到主键,外键,主表,从表,字典表,事实表,纬度表这些不同的概念的时候,当对称性出现破缺的时候,我们思维中的模型才能够丰富化起来。
关系模型理论应用到数据库具体应用中时,并不需要死守关系范式教条,它们只是描述了某种极端化的对唯一性的追求。面对具体应用的时候,理论本身也在不断丰富化。我并不把现实应用中必然需要增加冗余字段看作是关系理论失效的结果。从关系完全分解,到关系完全不分解之间,我们可以建立大量的模型。建立冗余字段的时候,我们存在着大量可能的选择,到底哪一种选择是最优的,理论方面仍然可以给我们以具体的指导。理论在各种不同纯化程度的关系模型中都可以给我们以直观的建议。数据仓库理论中建立的snowflake模式和star模式,强调了针对主题域的允许部分冗余的关系分解。这里实际上是强调了表之间的不同性。不再是所有的表都处于同一地位。Fact Table和Dimension Table之间的区别被识别出来,并被明确处理。在我看来,这是原始关系模型的一种自然发展,它也是关系模型理论的一部分。理论不应该是单一的,而是提供一个模型级列,在不同的复杂性层次上,我们可以根据理论的指导选择具体的实现模型。
关于ORM
http://canonical.iteye.com/blog/111500
关系模型中的所谓关系是在使用时刻才定义的,所有建立关系的方式在某种程度上都是等价的,也是外在的。而在ORM中主键与外键之间的关联被独立出来,成为模型内置的部分。这在很多时候简化了数据查询的结构构造过程。
在ORM中主键因为缓存的存在而显出与其他字段的区别。ORM的使用使得数据存储的分解策略得到扩充。并不是所有的表的更新频度都是一致的,而且表中的数据量大小也不同。字典表一般较小,而且很少更新,可以安全的复制。在整个数据存储框架中,ORM作为独立的技术元素参与数据存储过程,通过主键提供缓存服务,产生了新的数据分布模型,提供了新的性能优化契机。
分享到:
相关推荐
返回的对象具有以下字段: 栏位名称描述字段类型用于定义自定义FieldType的FieldType类模型用于创建表和查询的Model类ORM ORM实例来配置ORM fieldTypes 默认FieldType的列表配置ORM 调用API.ORM:initialize(options...
利用Java反射和注解实现自定义的ORM,并提供相应的工具类自动生成CRUD的SQL语句,同时定义了完整的异常处理机制
//函数的返回值 和 查询结果 泛值的对应关系分三类如下: //1. List查询 //public DataTable method_name(...){... return Query.getList(); } 或 //public List method_name(...){... return Query.getList(); ...
基于ORM模型的物资管理系统的设计和实现,任钢,,本文提出了一种基于.NET平台的实现对象和关系数据库的转化的ORM模型。在分析.NET平台的数据库处理的技术基础上,本文设计了一个对象/
Swift-Kuery-ORM Swift-Kuery-ORM是为Swift构建的ORM(对象关系映射)库。 使用它可以简化服务器上模型对象的持久性。 Swift-Kuery-ORM建立在最上面o Swift-Kuery-ORM Swift-Kuery-ORM是为Swift构建的ORM(对象...
结果,无法通过匹配多个列来定义一个模型与另一个模型之间的关系。 急于加载关系时,尝试使用where clauses (如下面的示例)将不起作用,因为在处理关系时$ this-> team_id为null。 namespace App ;use Illuminate...
NULL 博文链接:https://lunzi.iteye.com/blog/1675871
ORM英文是(Object Relation Mapping),中文意思是对象关系映射,它是RDBMS和业务实体对象之间的一个映射。换句话说,是将底层的RDBMS封装成业务实体对象,提供给业务逻辑层使用。优点是: 一旦定义好了对象模型,...
外键的存在使得 ORM 框架在处理表关系的时候异常的强大。因此这里我们首先来介绍下外键在 Django 中的使用。 类定义为 class ForeignKey(to,on_delete,**options) 。第一个参数是引用的是哪个模型,第二个参数是在...
Vuex ORM允许您在Vuex Store中创建“规范化”的数据模式,并具有与其他任何常规ORM库一样的“具有一个”和“属于许多”之类的关系。 它还提供了流利的API来获取,搜索和更新商店状态。 Vuex ORM受到Redux的 和配方...
Vuex ORM允许您在Vuex Store中创建“规范化”的数据模式,并具有与其他任何常规ORM库一样的“具有一个”和“属于许多”之类的关系。 它还提供了流利的API来获取,搜索和更新商店状态。 Vuex ORM受Redux的“规范化...
Doctrine 2 是 PHP 7.1+ 的对象关系映射器 (ORM),为 PHP 对象提供透明的持久性。 它位于强大的数据库抽象层 (DBAL) 之上。 其主要功能之一是可以选择以专有的面向对象 SQL 方言编写数据库查询,该方言称为 Doctrine...
具有关系(一对一,一对多,多对多),预加载,级联,多态关系等的源生成的ORM产品特点人际关系预载级联级联刀片级联更新级联清除移民多态关系复合主键复合外键入门声明模型class User { @PrimaryKey () String id;...
:用于Redux-ORM模型的React PropTypes验证和defaultProps mixin 用法 有关详细的演练,请参阅。 它不是最新的,但是。 Redux文档也有关于Redux-ORM。 声明您的模型 您可以使用从Model扩展的ES6类语法声明Model 。 ...
桑德博姆SanteDB高性能对象关系模型关于santedb-orm模块为SanteDB提供了一个高性能的ORM,类似于其他ORM解决方案,例如Entity Framework,Linq-to-SQL等。 最初,SanteDB / OpenIZ使用实体框架与基础数据库进行交互...
Vuex-ORM-GraphQL增强了Vuex-ORM,使您可以通过GraphQL API通过Vuex-ORM模型将Vuex状态与服务器同步。 该插件将根据您的模型定义并通过从服务器读取您的GraphQL模式自动生成GraphQL查询和变异。 因此
Nohm是为node.js编写的对象关系映射器(ORM),而RedType是用Typescript编写的。 产品特点 标准的ORM功能(验证,存储,搜索,排序,链接/取消链接,删除) 与浏览器共享验证。 允许使用与后端相同的代码进行客户端...
ORM过滤条件、外键约束和表关系一、Flask数据库过滤条件二、ORM模型的外键约束1.ORM建立外键关系2.ORM数据库外键约束3.存在外键时数据的查询三、Flask数据库表关系1.一对多关系 一、Flask数据库过滤条件 过滤条件...
ORM模型介绍 随着项目越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了: SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长。会出现很多相近的SQL语句。 很多SQL语句是在...
un 使用golang编写并支持JSON模式的对象关系映射器(ORM)。