如何使用数据访问对象进行序列化和放大关系数据库数据访问

时间:2008-10-13 12:59:20

标签: c++ design-patterns serialization persistence data-access-layer

我正在开发一个C ++域模型类库,它应该提供一些工具或框架(即接口类等),用于向/从二进制文件和RDBMS写入/读取类实例数据。此库的基础是使用RDBMS的应用程序,有几种方法通过执行一系列数据库检索和更新调用来获取成员数据集合来实例化类。序列化数据访问有一种不同的组织数据的方式,所以我希望域模型完全不知道主/外键,ID等。

为了解决这个问题,我考虑使用Data Access Object(DAO)模式,并希望对“粒度”,生命周期和DAO对象的使用有一些建议(在你的回复中,请注意我将使用C ++,而不是Java,并且域类不能保存来自RDBMS或二进制文件存储的任何ID /密钥信息):

  1. 域对象的每个Foo实例是否都有自己的FooDAO实例,或者是否为Foo类的所有实例都有一个FooDAO实例?
  2. 是否为每个Foo实例创建了一次FooDAO,或者只在需要访问数据时才创建FooDAO实例,并在之后立即销毁?
  3. DAO上的J2EE页面除DAO外还引入了DTO。为什么DAO不能传输数据?
  4. 对于具有其他域类Bar实例的复杂域类Foo,FooDAO类似乎不可避免地使用BarDAO类来检索数据。这将导致域类结构和DAO类结构中的并行层次结构/依赖关系。如何最好地管理这个?
  5. 感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我没有一个很好的解决方案,但我可以告诉你我有什么,以及一些想法和经验。基于我之前看到过的模型,我已经构建了一些非常相似的东西作为C ++库。

一些想法,没有特别的顺序:

  • 为DB中的每个实例分配一个单独的DAO对象实例。如果你有一个共享实例,线程同步可能是一个问题,你将被迫做很多副本。
  • 我的库DAO类使用与RDBMS类型密切相关的类型,原因有两个。首先,库支持在底层数据存储中自动创建和更新存储,因此类需要有足够的信息来创建表。其次,它使数据转换更加容易和可优化(例如,您可以使用本机接口直接执行ODBC / OLEDB数据复制)。缺点是您不能在DAO对象中使用“nice”类类型(例如:字符串抽象,其数据多于实际的字符串缓冲区)。
  • 我当然是按需创建的,因为商店中存储的数据可能远远超过内存中的数据。
  • 我尝试保持DAO类简单,具有最小的访问器功能,并“关闭”底层数据结构。这意味着没有来自其他DAO类的继承,实例具有关键变量成员等。

在DAO类之上,我构建了更多可访问的类,这些类代表了我的应用程序中的数据,可能会也可能不会将1-1映射到DAO类。允许它们具有任何类型的成员和结构,应该是应用程序使用的,并且具有将数据复制到DAO类中的方法,这些方法是构成它们的DAO类。

希望有所帮助。

答案 1 :(得分:0)

我不知道最好的实现,但这是我见过的:

  1. 为每个实例分开。
  2. 在需要之前创建并在之后立即销毁。
  3. 不知道。
  4. 合并DAO实例之外的数据,从而避免耦合。
  5. 免责声明:这正是我所见过的。