C++类设计基于数据库模式

3
我正在编写一个Perl脚本来解析MySQL数据库模式并在必要时创建C++类。我的问题很简单,但是我以前没有做过,也不知道常见的做法。任何创建的类的对象都需要有“get”方法来填充此信息。因此,我的问题有两个:
  1. 是否有意义在构造函数中调用所有get方法,以便对象立即拥有数据? 一些类将有很多这样的方法,因此根据需要也可能是有意义的。我现在有两个构造函数。一个填充数据,另一个不填充。
  2. 我是否应该再有一个“get”方法,用于检索对象的数据副本而不是数据库副本。
对于#1我可以双向思考,在#2上我倾向于是。任何建议、指针将不胜感激。
5个回答

2
通常,应用程序中最昂贵的部分是与数据库的往返操作,因此从单个查询中填充所有数据成员比逐个填充更加高效,无论是按需还是从构造函数中进行。一旦你为往返操作付费,最好把钱花得值得。
另外,通常情况下,你的get*方法应该被声明为const,这意味着它们不会改变底层对象,因此让它们去数据库中填充对象将会打破这一点(你可以通过使成员变量可变来允许这种情况,但这基本上会打败const的目的)。
为了将事情分解为具体的步骤,我建议:
1.让你的构造函数调用一个单独的init()方法,该方法查询数据库并填充对象的数据成员。
2.将你的get*方法声明为const,并只让它们返回数据成员。

我完全同意关于数据库访问的观点。但问题在于,将有多个可执行文件使用这些类,并且很多数据会被不必要地填充。这就是我开始感到困惑的地方。其中大部分将是只读访问。 - KlobY
我应该澄清一下,不同的可执行文件将使用一个类来处理数据库中不同子集的字段(列)。谢谢您的回复。 - KlobY
我仍然认为,除非我们谈论的是非常复杂或大型的数据类型(比如2MB的CLOB),否则多次访问数据库的成本很快就会超过填充不需要的数据的成本。 - JohnMcG

1

首先要认识到你正在重新发明轮子。几乎每种编程语言都有一些不错的对象关系映射库,用于数据库访问。对于C/C++,你可以看看以下几个:

http://trac.butterfat.net/public/StactiveRecord
http://debea.net/trac

好的,既然那个问题解决了,你可能想在你的类中创建一个名为find或search的静态方法,它是一个工厂用于构建对象并从数据库中选择它们:

Artist MJ = Artist::Find("Michael Jackson");
MJ->set("relevant", "no");
MJ->save();

请注意保存方法,该方法将修改后的对象存储回数据库。如果您确实想创建一个新记录,则可以使用new方法来实例化一个空对象:
Artist StackOverflow = Artist->new();
StackOverflow->set("relevant", "yes");
StackOverflow->save();

请注意,这里的set和get方法只是从对象中设置和获取值,而不是从数据库中。要实际将元素存储在数据库中,您需要使用静态的Find方法或对象的save方法。

是的,我见过一些(包括sql2class),我还没有真正考虑过Active Record或ORM,但这也是可能性之一,我想。 - KlobY

0

已经存在将数据库反向转换为Java(以及可能的其他语言)的工具。建议使用其中之一并将其转换为C ++。


0
我不建议你的get方法去访问数据库,除非对于你的特定问题绝对必要。这样会导致很多可能出现问题的地方,并且可能会在您的数据库上读取很多不必要的数据,并且可能会意外地将您的对象与特定于数据库的功能联系起来,从而失去分层架构的许多好处。就您的领域模型而言,数据库不存在。
编辑-这是针对#2(显然)。 对于#1,我会说不,出于很多相同的原因。

0

另一种选择是不自动创建类,而是创建单独的类,仅包含各个可执行文件感兴趣的数据成员,以便这些类只提取必要的数据。

不过,我不知道我们要谈论多少张表,这可能会扩大您的项目范围。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接