摘自:http://topic.csdn.net/t/20030516/18/1794284.html
1.在基于DELPHI的面向对象系统中,对数据库操作应如何进行静态和动态设计?
不知大家有否注意到,如果完全使用面向对象形式对数据库系统进行构造,则在使用时会产生大量的对象实例,因为“一类一表”结构所对应的应该是“一记录一对象实例”,即便使用“懒对象”,如果同时操作的记录一多,其实例数量也会相当惊人,而且用此方法又如何对检索后的数据进一步检索呢(难道非得放着SQL不用,而用手工检索吗?)
DELPHI提供的TQUERY/TTABLE等控件是基于“一对象一表”的,但我不清楚是否真的能用这种结构进行面向对象设计,还是只能把它作为一个用于检索或生成视图的工具类?
所以我想问一下大家在DELPHI中是如何进行“面向对象”数据库系统设计的?(还是依然在使用面向过程设计?又是如何对系统中其它的“类”进行协作?我这次依然使用了面向过程方式,但没有找到从面向对象到面向过程的映射关系)
一个简单的例子:
一个组管理多个用户,一个用户只能加入一个组;一个组拥有一组资源,一个资源只属于一个组;一个组可以有多个子组,每个子组也可以有多个父组;子组的资源对父组是公开的(继承关系)。
系统要求的操作是:得到某个用户所能使用的所有资源。
面向对象设计的静态结构(一类一表):
+-----+
* | | +--------+
+------+ * 1 +----+ * |----| 组继承 |
| 资源 |-------| 组 |---+ +--------+
+------+ +----+
| 1
| *
+------+
| 用户 |
+------+
面向过程(大部分管理细节由动态结构定义,也不能表现出数据库结构,但实例数少得多):
+--------+ 1 * +--------+ 1 1 +--------------+
|用户管理|-----|活动用户|-------|用户可用资源集|
+--------+ +--------+ +--------------+
--------------------------------------------------------------------------
2.我在对一张多通道板卡进行上层包装时,注意到多数情况下,DELPHI的容器类控件会把事件指针放在子类中(也就是子类中有自己独立的事件),但如果我把它提到容器中也应是可以的(也就是多个子对象共用一个容器事件,事件参数中包含子对象引址),这样对面向对象软件设计来说只是在结构中多了一个“关联类”,但对面向过程的编程来说可以方便很多。所以我想问一下,一般大家对此类包装会更倾向于哪一种形式?为什么?
EdwinYeah(Edwin)网友的回答:
其实这个topic根本的问题有两个:o/r mapping和object persistence。
国外早有成熟的理论及方案。
理论看这里:
1.Encapsulating Database Access
http://www.agiledata.org/essays/implementationStrategies.html
2.The Fundamentals of Mapping Objects to Relational Databases
http://www.agiledata.org/essays/mappingObjects.html
3.The Design of a Robust Persistence Layer for Relational Databases
http://objects.nease.net/persistenceLayer_ch.pdf(中文版)
delphi下成熟的方案首推由BoldSoft开发,后被Borland收购的bold for delphi。
其它的还有InstantObject,ObjectSight, tiOPF等。