質問

以前からとのディスカッションを行った同僚の持続 ドメインモデル かし実施する外部キー制限のデータベースです。

私の最初の反応の非常用のリレーショナルデータベースを暗黙の執行などの制約があることを提唱するとともにデータベースとして捉えられるべきであるそのものであり、永続化機構として置かないでくださるビジネスロジックします。しな利用の外部キー制限.

ここでは私の質問(いすぎない一般):では良好と考えられる実践を徹底キー制約論文のケースはどうでしょうか。

役に立ちましたか?

解決

強制約がないお ビジネスロジック

  • No 事業 ロジックのデータベース:思いを原則とします。ご SQL 事業コード 頼り データベース上の制約をチェックデータベースの整合性、その後すぐのビジネスロジック
  • るべきである、ということになりのデータベースの制約 のほか、 お客様の企業論理です。特にそのように参照整合性外国人とのキーおよびその他の独自の制約は簡単で、RDBMS行っている登録をお試しください。非常に効率的なメンテナンス。
  • ま使用しないで 指標 データベース上のものではありませんので、 純粋に 継続の関係は以下のようになります。
  • を見つけ、固定ソフトウェアにバグがありますが、同時にま たくない、という方にもっと時間の清掃又は(悪)失データだけで行うことができます。自分でトラブルの一行スクリプトのためのFK.ん:お車も無料でこちらをご拒否するのですか?
  • [編集-1]: できるという保証はデータをデータベース管理してい のみ を経由してください。あずかの例外は、主に電力-ユーザーの方にもっともっと参加してもらい(ことはありません:-)間違いを犯行の一部SQLステートメントをクリーンコード、更新状況を無効を設けていないものについては、誤字)など。
  • [編集-2]: 建物 ドメイン駆動 モデルとはありませんな雇用の良いDB admin.を用いORMとはありませんな雇用の良いDB ートします。

ただ、チームは書くことができる bug-無料ソフトウェア 取り扱い可能なシナリオの例外コードを含むハードウェア-ネットワーク/ダミー-ユーザ/グ-エラーの故障、その男は、なぜわざわざと 冗長 FK制約...." - -ティザー-

他のヒント

私はそう思う、私はそれではない限り、ビジネスロジックのための何かが、データベースに入力されることから「悪い」データを防止することを検討してください。データベースが非常に大きくなると、これらの制約は、将来的に頭痛を防ぐことができます。

あなたは、同じデータに対するアプリケーションの開発複数の開発者がある場合、これは特に発効します。これは、彼らが同様にのみ有効なデータを入力することができようになります。 1つのスポットではなく、Xのアプリで制御制約を持つことは確かに有益である。

私は純粋な開発方法論のために非常に便利なツール(データベースレベルのデータの整合性)を無視してのように感じては逆効果です。データベースは、この種のものでは本当に良いです...彼らはそれをやらせます。

いくつかの時点で、すべての方法論は崩壊し始め、あなただけ実用的である必要はあります。

私はそう思うために使用されるが、私はリソース指向のシステムの多くを書き始めたので、私の意見が変更されました。その上の値「ASSIGNED_TO」有効を持っている必要があります例えば、「割り当てられた」状態にあるチケット、及び - 一般的に、単に外部キー制約よりもはるかに多くのデータの一部を検証するために必要とされています。これらのルールはすべて、ある種の検証ルーチンに配置する必要があり、理論的には、のあなたのアプリレベルの検証が外国をチェックし、動作しているかの、データベース・レベルでの余分な検証を持っていて損はないかもしれないがキー制約はただのサイクルを無駄にしています。検証コードとデータベース制約 - はるかに悪い、しかし、あなたは今、あなたの2つの場所で繰り返されるデータモデルについてのロジックを持っています。

それについてこのように考えて:あなたは、データベースにして他のアプリケーション・ロジックを移動したい(例えば、ストアドプロシージャを経由して)あなたが持っていなかった場合は?あなたは、パフォーマンスを考慮してそうすることを余儀なくされていなかった場合、私は答えは、一般的にされるべきだと思う「いいえ。」

「私の最初の反応は、リレーショナルデータベースの非常に使用が、このような制約の施行を暗示ということでしたが、いくつかは、データベースが永続化メカニズムが、何として見られるべきであるので、我々はそれにすべてのビジネスロジックを配置しないようにすべきであると主張しました。当社は、外部キー制約を使用しないでしまった。」

はい、まあ、平凡な大半は常に残念ながら、数字の単なる力での議論のようなものを勝っています。

あなたはまだ、どのように彼らはから誰を維持しようとする(DB2-援助、SPUFI、... ALA)、あなたは彼らが「直接データベースエディタ」を使用してから誰を維持するつもりどのようにあなたの対戦相手を頼むかもしれない戦いをしたい場合(定義により、そのプログラムのビジネス上の制約をバイパス)などのツールを使用してデータベースを破損ます。

あなたは、ドメイン駆動設計パラダイムをフォローしたい場合は、

、そして、答えは任意のクロス集計のリンクについてはノー集約内の何のためにそうなる、と考えています。

ほぼすべてのケースでは、あなたがルート自体が削除されたときに削除する集約ルートの下に何かをしたい、とカスケード削除とそう、これを表現する外部キーを持つ、データベース・レベルでこれを達成することができます。また、あなたのリポジトリを使用すると、DBのレベルでそれを行うにはしたくなかった場合は、カスケードは、自分自身を削除しますが、ポイントはまだ集計子供がルートなしでは存在してはならないことを意味します。

やることができました

は、クロス集計の懸念のために、あなたはおそらくどちらか一方が削除されたときにどうするかのようなビジネス上の意思決定を扱うことになります。多くの場合、あなたは、スケーラビリティを可能にするために、この非同期的に対処したいと思う、ので、あなたのドメインモデルは、最終的には一貫なってしまいます。したがって、それはどちらか一方のキーが存在しない可能性があります。

時間の窓があるだろうと外部キーを強制するためにこれらのケースでは意味がありません。

役に立てば幸い!そして、詳細は、間違いなく、ドメイン駆動設計上のエヴァンスの本noreferrer">アウト

scroll top