2008-09-17 12 views
3

私は、mysqlデータベーススキーマを解析し、必要に応じてC++クラスを作成するためのperlスクリプトを作成しています。私の質問はかなり簡単ですが、私が以前にしたことはなく、一般的な習慣を知らないものです。作成されたクラスのオブジェクトには、この情報を設定するための「取得」メソッドが必要です。だから私の質問は二倍です:データベーススキーマのC++сlassデザイン

  1. オブジェクトがすぐにデータを持つようにコンストラクタのすべてのgetメソッドを呼び出すことは意味がありますか?いくつかのクラスはそれらをたくさん持っているので、必要に応じて意味をなさげるかもしれません。私は今、2つのconstrcutorsを持っています。データを取り込むものとそうでないもの。
  2. dbコピーではなく、オブジェクトのデータコピーを取得する別の「取得」メソッドを用意する必要があります。

私は#1で両方向に進み、#2でyesに向かっています。任意のアドバイス、ポインタは非常に高く評価されるだろう。

答えて

0

dbをJava(とおそらく他の言語)に変換する既存のツールがあります。そのうちの1つを使用して、それをC++に変換することを検討してください。

0

特定の問題に絶対に必要な場合を除き、getメソッドをデータベースにまったく使用しないことをお勧めします。これは、何かが間違っている可能性のある場所をたくさん作成し、おそらくDB上で不必要な読み込みが多くなり、誤ってオブジェクトをDB固有の機能に結び付けることができ、階層構造のメリットが失われます。あなたのドメインモデルに関する限り、データベースは存在しません。

編集 - これは#2です(明らかに)。 #1の場合、私は同じ理由の多くのために、いいえと言います。

1

最初に、ここでホイールを再発明していることに気付きます。ほぼすべての言語でデータベースにアクセスするためのオブジェクト・リレーショナル・マッピング・ライブラリーが数多くあります。その方法のうちに、あなたはおそらくのために工場で検索するか、検索と呼ばれるクラスの静的メソッドを作成したい、

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

OK:C/C++のあなたはに見えるかもしれませんオブジェクトを構築し、データベースから選択する:

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

saveメソッドは、変更されたオブジェクトを取得してデータベースに戻すことに注意してください。

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

注セットとここだけの設定方法を取得し、オブジェクトから値を取得していない:あなたが実際に新しいレコードを作成する場合は、空のオブジェクトをインスタンス化しますnewメソッドを使用したいですデータベース。実際にデータベースに要素を格納するには、静的Findメソッドまたはオブジェクトのsaveメソッドを使用する必要があります。

+0

ええ、私はいくつか(sql2class)がそれらの1つであることを見てきました。私は実際にActive RecordやORMとは考えていませんでしたが、それは可能性があります。 –

2

通常、アプリケーションの中で最もコストがかかる部分はデータベースへのラウンドトリップなので、一度に1つずつ実行するよりも、1つのクエリからすべてのデータメンバーを移入する方がはるかに効率的ですあなたのコンストラクタから、往復の支払いを済ませたら、あなたのお金の価値を得ることができます。

また、get *メソッドはconstとして宣言する必要があります。つまり、基礎となるオブジェクトを変更しないため、オブジェクトを移入してオブジェクトを移入させると、そのオブジェクトが破損します。メンバ変数を変更可能にしますが、これは基本的にconstの目的を無効にします)。

ダウンの具体的な手順に物事を破るために、私が推薦する:

  • をあなたのコンストラクタは、データベースを照会して、オブジェクトのデータメンバーを移入し、別のinit()メソッドを呼び出しています。
  • get *メソッドをconstとして宣言し、データメンバーを返すようにしてください。
+0

私はdb旅行について100%同意します。注意すべき点は、これらのクラスを使用する複数の実行可能ファイルが存在し、多くのデータが一時的にポーリングされるということです。それが私の頭を傷つけるところです。そのほとんどは読み取り専用アクセスです。 –

+0

私は、異なる実行可能ファイルが異なるサブセットのフィールド(dbの列)にクラスを使用すると言っていることを明確にする必要があります。お返事をありがとうございます。 –

+0

私はまだ、2MBのCLOBのような非常に複雑で大きなデータ型について話しているのでなければ、複数のデータベースヒットのコストは、あなたがかなり素早く必要としないデータを設定するコストを犠牲にすると言います。 – JohnMcG

0

別の方法として、クラスの作成を自動化せず、個々の実行可能ファイルが必要とするデータメンバーのみを含む別々のクラスを作成し、必要なデータのみをプルするようにすることもできます。

私たちが話しているテーブルの数がわからないので、プロジェクトの範囲が爆発する可能性があります。

関連する問題