浅析对象关系映射

来源:互联网 发布:mac开发工具 编辑:程序博客网 时间:2024/06/16 23:07

        对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,来实现面向对象语言程序中的对象与关系数据库中的关系的映射。根据对象与关系数据库的特性,ORM一般在以下几个方面实现。

1.类的属性映射为数据表的字段

        将类中的属性映射成数据表的字段是一种很自然的想法,但是类的属性和数据表的字段并不是一一对应的。一个属性可以对应0或多个数据表字段。比如,作为保存中间结果或标明类在某一运行时刻状态的属性就不需要保存在数据库表中。

2.类映射成数据表

        将类映射成数据表时,通常采用的映射策略有以下几种:
        (1)一个类层次对应一个数据表
        这里所说的一个类层次,指的是父类及其所有子类。将父类和子类中有持久性需求的属性映射到一张数据表中,使用一个标志字段区分各个子类。这种方法实现起来比较简单,但是类与数据库之间的耦合程度较高;并且因为子类所特有的属性都被映射成了字段,所以数据表中的冗余字段比较多,空值也有很多,空间的利用率较低。
        目前来说,有一种方法可以克服这种映射方式冗余列多的缺点,那就是将子类的公共属性映射成一个字段,该字段使用json或xml等方式存储子类的所有特有属性。但是这种方法并不符合数据库设计中的1NF范式,应为该字段还可以进一步细分。
        (2)一个实体类对应一个数据表
        在这种实现方式中,父类并不映射成数据库中的表,只有子类会被映射成数据库中的表,该表的字段包括从父类继承的属性以及子类特有的属性。这种映射模型使得类属性值的保存和对象还原实现方便。缺点同样是类结构与数据库的耦合程度高,当父类的属性变动时,所有继承父类的子类都需要进行更新。
        (3)一个类对应一个数据表
        无论是父类还是子类,只要类中的属性有持久化的需要,就将类映射到数据表。子表以父表的主键作为外键。这种映射方式在关系数据库中最大程度上实现了类的多态性。与前两者相比,对象与数据库的耦合程度是最低的,某一类属性的变动引起表结构的变动最少。这种方法的缺点在于生成子类实例时,继承层次多的子类的属性值还原困难,因为要链接多个表进行查询。当类的层次较多时,子类的访问可能会成为系统与数据库交互的瓶颈。

3.类间关系映射为键值

        数据库的表现形式,决定了只能体现类关系中的关联和聚合,对其他的关系,只能在业务逻辑中以编码的方式式实现。一对一、一对多的关联是通过在关联的某一方(一般在关联角色多重性大于等于1的一方)引用对方的主键,并视关系的紧密程度为外键的字段加上非空以及唯一性的约束。在生成相关联的类实例时,可根据外键自动获取另一方的实例。多对多的关联需要创建关联表。关联表有其自己的主键,同时以关联角色双方的主键作为联合外键。
聚合关系映射到数据库中与通常所说的主附表结构类似,在聚合关系中的子类对应的数据表中含有指明父类的主键。特别是强制型聚合(或称之为组合),子类单独存在是没有意义的,必须与父类同时存在、同时消亡。
以上所说的对象关系映射机制在实际应用中要根据特定的系统需求,作出适当的取舍。需求是千变万化、层出不穷的,类的设计要真实地反映现实需求,这是对象关系映射的基础。综合考虑映射效率、适应变化能力的要求,设计数据库结构。从而形成结构质量优良的对象关系映射模型。

参考文献
[1] 何铮, 陈志刚. 对象/关系映射框架的研究与应用[J]. 计算机工程与应用, 2003(26): 188-194

原创粉丝点击