【问题标题】:C++ class design from database schema来自数据库模式的 C++ 类设计
【发布时间】:2010-09-10 03:45:19
【问题描述】:

我正在编写一个 perl 脚本来解析 mysql 数据库模式并在必要时创建 C++ 类。我的问题是一个非常简单的问题,但我们是我以前没有真正做过的事情,也不知道常见的做法。创建的任何类的任何对象都需要具有“get”方法来填充此信息。所以我的问题是双重的:

  1. 在构造函数中调用所有 get 方法以使对象立即获得数据是否有意义?有些课程会有很多,所以根据需要也可能有意义。我现在有两个构造函数。一种填充数据,另一种不填充。
  2. 我是否还应该有另一个“get”方法来检索对象的数据副本而不是 db 副本。

我可以在 #1 上双向选择,而在 #2 上我倾向于是。任何建议,指针将不胜感激。

【问题讨论】:

    标签: c++ mysql database oop class


    【解决方案1】:

    现有的工具可以将 db 转换为 java(可能还有其他语言)。考虑使用其中之一并将其转换为 c++。

    【讨论】:

      【解决方案2】:

      我不建议您将 get 方法转到数据库,除非您的特定问题绝对必要。它会导致更多的地方出现问题,并且可能会在您的数据库上进行大量不必要的读取,并且可能会无意中将您的对象与特定于数据库的功能联系起来,从而失去分层架构的许多好处。就您的域模型而言,数据库不存在。

      edit - 这是为#2(显然)。对于 #1,我会说不,出于许多相同的原因。

      【讨论】:

        【解决方案3】:

        首先意识到您在这里重新发明了轮子。几乎每种语言都有许多体面的对象关系映射库用于数据库访问。对于 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();
        

        请注意 save 方法,该方法随后将修改后的对象存储回数据库。如果你真的想创建一个新记录,那么你可以使用 new 方法来实例化一个空对象:

        Artist StackOverflow = Artist->new();
        StackOverflow->set("relevant", "yes");
        StackOverflow->save();
        

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

        【讨论】:

        • 是的,我见过一些(sql2class)就是其中之一。我没有真正考虑过 Active Record 或 ORM,但我想这是一种可能性。
        【解决方案4】:

        通常,应用程序中最昂贵的部分是往返数据库,因此从单个查询中填充所有数据成员比一次执行一个查询要高效得多,或者根据需要根据或从您的构造函数。一旦您支付了往返费用,您也可以物有所值。

        此外,一般来说,您的 get* 方法应声明为 const,这意味着它们不会更改底层对象,因此让它们到数据库中填充对象会破坏这一点(您可以通过使成员变量是可变的,但这基本上会破坏 const 的目的)。

        要将事情分解成具体的步骤,我建议:

        • 让您的构造函数调用单独的 init() 方法来查询数据库并填充对象的数据成员。
        • 将您的 get* 方法声明为 const,然后让它们返回数据成员。

        【讨论】:

        • 我 100% 同意 db 旅行。需要注意的是,将有多个可执行文件使用这些类,并且会不必要地填充大量数据。这就是我开始挠头的地方。其中大部分将是只读访问权限。
        • 我应该澄清说,不同的可执行文件将为不同的字段子集(数据库中的列)使用一个类。感谢您的回复。
        • 我仍然会说,除非我们谈论的是非常复杂或大数据类型(如 2MB CLOB),否则多次数据库命中的成本将超过填充数据的成本。不需要很快。
        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多