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

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

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

  • 谢谢你的帮助!

    最佳答案

    我没有适合您的解决方案,但是我可以告诉您我所拥有的以及一些想法和经验。我已经基于以前使用的模型(作为C++库)构建了非常相似的东西。

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

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

  • 在DAO类之上,我构建了更多可访问的类,这些类代表应用程序中的数据,并且可能(也可能不)将1-1映射到DAO类。它们被允许具有任何类型的成员和结构,被假定为应用程序所使用的成员,并具有将数据复制到作为其基础的DAO类/从DAO类复制数据的方法。

    希望能有所帮助。

    关于c++ - 如何使用数据访问对象进行序列化和关系数据库数据访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/197509/

    10-09 07:04
    查看更多