ベストプラクティス:データベースアプリのプログラミングパターン


11

私はこれまで多くのデータベース(MySQL)Webアプリを書いてきましたが、私の構造はちょっと不器用だといつも思っています。ここでいくつかのアドバイスを期待して、使用しているプログラミング/設計パターンを改善したいと思います。特に、データベース(スキーマ)の実装をカプセル化するOOPアプローチを補完する構造を見つけることができません。私

私の質問は例で最もよく説明できると思います。Invoiceオブジェクト/クラスがあると言う2つのアプローチがあります。

最初は静的メンバー関数を使用することです

class Invoice
{
   int id;
   string ref;
   int customer_id;
   date created;
   date due;

   static id create();
   static bool update(id, field1, field2, ...);
   static bool delete(id);
   static bool get(id);
};

2番目のアプローチは、すべてのものをデータベースオブジェクトに入れることです。

class Database extends ProprietaryDBConnecter, Singleton
{
   id createInvoice();
   bool updateInvoice(id, field1, field2, ...);
   bool deleteInvoice(id);
   bool getInvoice(id);

   id createCustomer();
   bool updateCustomer(id, field1, field2, ...);
   bool deleteCustomer(id);
   bool getCustomer(id);

   // etc...
}

(SQL)メンバー関数はどちらの方法でも「ビュー」から非常に切り離せないことがわかります。「ビュー」はクラスに必要なものを決定するため、ドキュメント/ビューアーキテクチャを壊すようです。

また、たとえばSELECTステートメントは必要なものだけを選択する必要があるため、一種の非効率的と思われますが、Invoiceのメンバー変数の存在は「データの保証」を意味するようです。

質問を明確に説明したかどうかわからない、このアーキテクチャ/デザインパターン/ what-it-is-known-asへの他のベストアプローチは何ですか?

アドバイスをありがとう

回答:


14

さて、ORMを使用できると思います。

しかし、実際には、データベース設計はOOP原則に従うべきではなく、正規化などのデータベース設計原則に従うべきです。また、アプリケーションではなくデータベースで設計する必要があります。また、データ整合性ルールは、アプリケーションではなくデータベースレベルで適用する必要があります。

データベース設計の本をいくつか読んでから、選択したデータベースのパフォーマンスチューニングについて読むことをお勧めします。


5
+1はすべてがOOPである必要はありません(一部のORMが非常に優れていても!)
ハビエル

1
O / RMは優れていますが、それらを使用しても、優れたデータベース設計に準拠できないというわけではありません。
BlackICE

1
@David、私は彼が何をしているのかを知っている人の手に真実であることに同意します。そして、私は彼がORMを見ることを提案しましたが、実際にデータベース設計を最初に知らなければ、ORMは危険なツールです。
HLGEM

これは、データレベルでデータ整合性ルールを実施できる良い点です。ただし、ルールが変更される可能性があり、アプリケーションのみがデータを変更する場合は、アプリケーションにいくつかのルール(「プロジェクトには常に5人以上のチームメンバーが含まれる必要がある」など)を入れることが理にかなっています。
ジョンオンストット

データを変更するのはアプリケーションだけではほとんどありません。データベースに入れられないビジネスルールは、誰かが何らかのデータ修正をサポートするために大量のデータをすばやく変更する必要がある場合、非常に簡単に違反する傾向があります。
HLGEM

10

データベースの実装をカプセル化するOOPアプローチを補完する構造が見つかりません

オブジェクトリレーショナルインピーダンスの不一致を説明しているようです。

このOODBMS、ORMツール、データアクセスツールのホストを解決することになっているものがいくつかあります。

たくさんの解決策があるという事実から、One True Solution™は存在しないと思うようになります。

そのため、一部の人はそれを嫌い、一部の人はそれを愛するという知識の中で、安全な方向を選ぶことができます。


より厳密な方法で、そのように見えます。
ジェイク

2

ORMラッパーを使用したくない場合は、MongoDBなどのOOPスタイルのストレージをサポートするデータベースを使用してください。

MongoDBの(「HUからモンゴたち」)クロスプラットフォームでのドキュメント指向データベースシステム。「NoSQL」データベースとして分類されるMongoDBは、従来のテーブルベースのリレーショナルデータベース構造を避けて、ダイナミックスキーマ(MongoDBはBSON形式と呼びます)を含むJSONのようなドキュメントを優先し、特定のタイプのアプリケーションでのデータの統合をより簡単かつ迅速にします。 ..

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.