あなたの指導原則は自分自身を繰り返さないでください:
ソフトウェアエンジニアリングでは、Do n't Repeat Yourself(DRY)は、あらゆる種類の情報の繰り返しを減らすことを目的としたソフトウェア開発の原則であり、特に多層アーキテクチャで役立ちます。DRYの原則は、「すべての知識がシステム内で単一の明確な権威ある表現を持たなければならない」と述べられています。
ORMは基本的に追加の層(または必要に応じて層)であり、アプリケーションとデータストレージの間に快適に座っています。制約は、ORM またはデータストレージの1か所で、1か所のみである必要があります。そうでなければ、すぐに別のバージョンを維持することになります。あなたは本当にそれをしたくありません。
ただし、実際には、ほとんどの適切なORMは、データスキーマから大量のモデルを自動的に生成します。重複はまだありますが、重複したORMコードは毎回同じパターンに従って生成されるため、メンテナンスヘルが発生する可能性は最小限です。重複するコードを持たないことが理想ですが、自動生成された制約が次善策です。
また、制約を1つの場所に配置することは、必ずしもすべての制約を同じ場所に配置する必要があるという意味ではありません。参照整合性制約など、一部はデータストレージにより適している場合があります(ただし、別のデータストレージに移動すると失われる可能性があります)。すべてのリンゴを同じバスケットに入れるのが望ましいでしょうが…
失敗
ORMの失敗に言及しています。それはあなたの質問とはまったく関係ありません。アプリケーションはORMとデータストレージを単一のエンティティとして考える必要があります。失敗した場合は失敗します。ORMをバイパスしてデータストレージと直接通信することはお勧めできません。
ORMをバイパスして何か他のものにする
また、良いアイデアではありません。ただし、さまざまな理由で発生する可能性があります。
ORMが導入される前にビルドされたアプリケーションのレガシー部分。
それは難しい問題であり、まさに私が今対処している状況です。したがって、「保守地獄」を繰り返し繰り返します。ORM以外の部分を維持するか、ORMを使用するようにそれらを書き換えます。最初は2番目のオプションの方が理にかなっているかもしれませんが、それはアプリケーションのこれらの部分が正確に何をしているか、そして長期的に完全な書き換えがどれだけ価値があるかだけに基づいた決定です。
うまく設計されていない2 * 10 ^ 8行のMySQLテーブルでキーを変更してみて(ダウンタイムなし)、私がどこから来たのか理解できます。
データストレージと直接通信する必要があるアプリケーションの非レガシー部分:
さらにトリッキー。ORMは派手なツールであり、ほとんどすべてを処理しますが、時には邪魔になったり、まったく役に立たないことさえあります。流行語(実際に流行語)はオブジェクトとリレーショナルのインピーダンスの不一致です。単純に言うと、ORMがリレーショナルデータベースのすべてを行うことは技術的に不可能です。
コメント
データの整合性の点から、データベースに制約を設定する必要があり、アプリケーションに制約を設定する必要があります。Webおよびデスクトップアプリケーション、モバイルアプリ、またはWebサービスからアプリケーションにアクセスした場合はどうなりますか?– ルイスダミム
ここで追加のレイヤーを追加すると非常に役立ちます。Webアプリケーションの場合は、REST APIを使用します。過度に単純化した設計これについては次のようになります。
ORMはAPIとデータストレージの間に位置し、APIの背後にあるすべて(APIを含む)は、さまざまなアプリケーションからの単一のエンティティと見なされます。