2

DALが(null可能な列から)null値を表すためのベストプラクティスがあるかどうか疑問に思っています。

現在、独自の社内 DAL があり、int.MinValue で null 値を表現しています。ただし、この上昇は、開発者が値を比較するときに意図的に別の「追加された」値を int.MinValue に課していると考えていることと、int.MinValue が DAL レイヤーの null 値に使用されているという事実に関係しています。そのため、.net 2.0 から NullValue を考え出す人もいますが、このアプローチにも関連するパフォーマンスと構文の問題があることがわかりました。

それで、あなたはこれについてどう思いますか?他の有名な ORM は null 値をどのように処理しますか? この問題に関するベストプラクティスはありますか?

4

6 に答える 6

10

null許容整数を表すために、毎回Nullable<int>(aka )を使用します。int?それはまさにそれが設計されたものです。いくつかのリンクを提供しましたが、null許容型の構文に関する問題がどこにあり、重大なパフォーマンスの問題が発生したかを正確に説明できます(データベース呼び出しは、どの変換よりもはるかにコストがかかる可能性があることに注意してください)。進行中)。

編集:最後から2番目のリンクは、私が関与するニュースグループの会話へのリンクであることに気付きました。この状況でnull許容型を回避する理由は、null許容値型を持たないプラットフォームにnull値を効果的に通信する必要があるWebサービスに関する質問だったためです。あなたが説明したように、それはあなたの状況には当てはまらないと思います。

于 2008-12-22T15:42:55.970 に答える
1

intのようなnull許容型を使用しますか?などなど。

于 2008-12-22T15:42:43.147 に答える
1

早速のお返事ありがとうございます。

どちらを使用するかはまだ決定中です。nullableがどのように機能するかはわかりませんが、データベースアクセスがボトルネックになることに同意しました。

nullableの使用で私が目にする問題は、実際には、ここで概説されている組み込みの.net演算子での動作が異なるためです。

null許容型を使用していて、2つの整数を正しく比較したい場合は、コードベースにNullable.Compare構文を散らかす必要があります。それが最大の解決策かどうかはわかりません。

于 2008-12-22T16:08:58.680 に答える
1

コメントするには長すぎるため、回答として追加されました。

コードベースに を散らかさなければならない場合Nullable.Compare、それは間違っています。Nullable<int>2 つの値が両方とも非 null であることがわかっている場合を除き、2 つの値を比較するべきではありません。

唯一の例外は、集約やソートなど、完全に避けられない場所です。Nullable<T>これを行うために標準的な方法 (Linq など) を使用している場合は、これを処理するために特別なものを実装する必要はありませんIComparable<T>

SQL Server では、NULL 用語を含む式が NULL と評価されるのには理由があります。式の項の 1 つが NULL の場合、式の結果は無意味です。ただし、式が (ISNULL または COALESCE を介して) 項が NULL の場合にどうするかを明示的に示している場合を除きます。これは、グローバルではなく、式の中または周りで行うべき決定です。

たとえば、この一見単純なロジックを考えてみましょう。

if (qtyOrdered > qtyInStock)
{
   Reorder(qtyInStock - qtyOrdered);
}

qtyInStocknullの場合、例外がスローされます。が null の場合、このロジックは何をすべきでしょうか? qtyInStockわかりません。これは、ビジネス ロジックの設計で対処する必要がある問題であり、まだ対処されていません。

しかし、ほぼ確実にわかっていることが 1 つありますqtyInStock。if が null の場合、アイテムの新しい順序を生成するのInt.MinValue - qtyOrderedは間違った答えです。マジック ナンバーを使用して null を示す場合、このようなロジックが実行されます。ロジックが壊れており、非表示にするのではなく、修正する必要があります。

于 2008-12-22T18:31:31.263 に答える
0

CJ Date は、一部にはこれらの問題があるため、RDBMS コンテキストに null が存在するべきではないと主張しています。それらをどのように回避しますか?それらを再設計することにより、さまざまな方法でデータを分割して、null になる列が単に無関係になり、そのような状況で論理設計から削除されるようにします。言い換えれば、テーブルと列を再設計して、すべての列が制約されているNOT NULLだけでなく、意味のある値を持つようにします ( のような代替のカスタム センチネルはありませんint.MinValue)。

これは大変な作業であり、その価値があるかどうかは喜んで議論されますが、実装のパフォーマンスと純度をそれほど気にするのであれば、おそらくそれはあなたが望むものです。

于 2008-12-22T19:10:16.737 に答える
0

私のデータ アクセス レイヤーでは、null をコンテキストに適した値に変換します。私の DAL の目的は、アプリケーションとデータをやり取りすることです。そのため、DAL はデータが何を表しているかを知る必要があり、デザイナーは適切な新しい値を推測できます。NULL 整数フィールドの正解は 0 かもしれませんし、テキスト フィールドにエラー メッセージが表示されるかもしれません。

そうすれば、アプリケーションがデータを読み取るときにデータが取得され、エンド ユーザーに表示されるときに、何かがゼロであり、テキストがあるべき場所に「利用可能なテキストがありません」と表示されることがわかります。

intを使用していますか?ヌル問題を 1 レベル高くするだけです。それが今、私の DAL の使い方です。

于 2008-12-22T16:29:13.600 に答える