[ORM]关系数据库与面向对象的映射讨论

在博客园看到下面的文章尽管还是老生常谈,喊了这么多年的ORM,最终还是无果,框架也出了不少最后还是在讨论这个问题,下面是引用的原文:


引言

面向对象的三个特征: 封装(encapsulation), 继承(inheritance), 多态(polymorphic), 其中继承是我们三个特征中最重要的应该就是继承了.

我们在程序中可以很自然, 很方便的表达继承的关系. 但是针对这样的继承关系, 我们如何设计数据库呢?通常我们有三种方式:

1. 一个继承树映射到一个表(one inheritance tree mapping to one table)

这种方式是将拥有共同父类的所有的类都看做成一张表(包括父类), 然后所有的类的所有的属性取并集, 组成数据表的所有列.

image

如上图类的结构图, Vehicle是父类, 拥有两个属性Engine和wheel, 而子类Truck有属性Container, 子类Car有属性Acoustics.

数据表被映射成

类属性 数据表字段
Engine Engine
Wheel Wheel
Container Contianer
Acoustics Acoustics

优点: 结构简单, 在数据表操作层可以很方便的实现针对这三个对象的数据库的insert, update, delete.

缺点: 这样的设计数据表, 会有大量的数据冗余.

 

2. 一个继承路径映射一个表(one inheritance path mapping to one table)

按照这种方式: 创建两张表, 分别是Truck和Car.

Truck 数据表

类属性 数据表字段
Engine Engine
Wheel Wheel
Container Container

Car 数据表

类属性 数据表字段
Engine Engine
Wheel Wheel
Acoustics Acoustics

优点: 没有数据冗余.

缺点: 当需要查询Vehicle的时候, 就需要在Truck和Car两个表里面进行查询. 当有越多类继承Vehicle的时候, 查询的效率就越低.

 

3. 一个类映射到一个表(one class mapping to one table)

按照这种方式: 创建三张表, 分别是Vehicle, Truck和Car.

Vechile 数据表

类属性 数据表字段
ID(Primary Key)
Engine Engine
Wheel Wheel

Truck 数据表

类属性 数据表字段
ID(Foreign Key)
Container Container

Car 数据表

类属性 数据表字段
ID(Foreign Key)
Acoustics Acoustics

优点: 为每个类创建表, 子表和父表通过ID进行关联, 数据冗余小.

缺点: 当继承体系的非常复杂的时候, 一些SQL语句会非常复杂, 效率也会非常低下.

 

其实在上面三种方式中, 我们使用最多的最常见的应该算是第三种, 但是有些情况下, 我们也需要考虑下其他数据表的创建方式.

毕竟模式是在一些特定的场合下, 才能充分体现它的价值. 我们在开发的过程中, 在类的设计方面愿意花费很多人力物力, 但是数据库的设计

 

这是我的回复:

其实关系数据库结构和对象之间可以利用中间层进行映射
第三种方法,的查询复杂度可以利用视图来降低
其实这三种方法用哪一种都无所谓,完全可以利用中间视图将数据库关系和对象隔离开,让关系的归关系,对象的归对象

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏