はデータベースのテーブルにデフォルト値?
-
21-09-2019 - |
質問
をしていてディスカッションの開発での作業を行うテーブルのデフォルト値を使用するあるハードのルールを定このようなものがありま灰色の領域ベス?
解決
私のルール:多くのレコードは、その後、私はそれをデフォルトとして使用したい(少なくとも最初は)そのデフォルトを使用する場合。たとえば、オンラインストアでの製品の画像テーブルはimages/NoPictureYet.png
のデフォルトのパスを持っているかもしれません。結局、これらの置き換えを取得しますが、写真は単にまだ存在しませんデータの一括ロードのための(そしておそらく最もそれらのん!)、デフォルトは(少なくとも、私には)理にかなっています。
何の賢明なデフォルトが存在しない場合(たとえば、顧客データベースの「ファースト・ネーム」として - 私は私の名前は「姓」にデフォルト設定したくない)、その後、私はそれがnull非許容およびデフォルトなし作る - それはアプリケーションの責任です正しい値が入力されることを確実にするために。
しかし、これには、ハードと高速なルール。これは、すべてのほとんど変化;)
他のヒント
は、私が個人的にデフォルト値をうまく利用した一つの実用的なケースは、last_modified
列のためです。
この列には、ストアドプロシージャやビジネスロジックによって更新されることはありませんが、行の任意の値が変化したときにトリガーによって自動的に更新されます。しかし、それはまた、新しい行の値は、それが最後に変更された場合、基本的にそれが作成されたときのタイムスタンプを含むであろうように、デフォルトでGETDATE()
に設定されている。
ALTER TABLE users ADD CONSTRAINT dc_users_last_modified
DEFAULT GETDATE()
FOR last_modified;
更新トリガは、このようなもののようになります:
CREATE TRIGGER trigUpdate_users
ON users
FOR UPDATE
AS
BEGIN
IF NOT UPDATE(last_modified)
UPDATE users SET last_modified = GETDATE()
WHERE user_id IN (SELECT user_id FROM inserted);
END
GO
ありません厳格なルールを適用することができます。これは、列に依存します。それは、例えば、デフォルトの順序タイプを持っていることが全く賢明かもしれないが、顧客の電話番号のデフォルトのアイデアは意味がありません。
私はその灰色の領域を言うでしょう。一般的に私は、デフォルト値のたくさんの新しいデータベースを設計していないだろうが、あなたは多くの場合、既存のシステムを強化する際にそれらを使用する必要があります。
例えば、既存のデータベースに新しい非ヌル列を追加します。あなたがしたい(またはすることができる)、そのテーブルへの挿入は、あなたが任意の「レガシー」のコードはまだデータINSERT(デフォルト値が適切であると仮定できることを保証するために、それにデフォルトを配置する必要がありますので、すべてのコードを更新しない場合があります当然のレガシーコードのため)。
は、列が値を持っている必要があります場合は、デフォルト値が重要である(それがnullではありません)。実際にあなたがそれらにデフォルト値を許可しないようにNULLを許可するから列を変更している場合は、ほとんど必要なすべての既存のコードに値を移入もないようです。時には、この場合のデフォルト値は「UNKNOWN」のようなものです。あなたはフィールドがNOT NULL
に列を変更するALTER TABLE文でnullのレコードをexisitingにデフォルト値を提供するために、値で使用したい場合、これは特にそうですデフォルト値は、ユーザーインターフェイスは、一般的に対処していないことをフィールドのために重要です。たとえば、私たちは、ユーザーがさえ存在を知っていないことをdate_insertedとuser_insertedの列にデフォルト値を持っています。多くの異なるアプリケーションがこれらの列について誰も忘れを確保しないようにデータを取り込むことができれば、これは特に重要です。
次に、典型的には、後に変更することができるデータ入力上の値を与えられている列があります。ステータス列のようなもの。
多くの列が実際にかかわらず、デフォルトを持つことができません。何がユーザーのデフォルトのアドレスまたは名前でしょうか?
tl;dr: デフォルト値はビジネスロジックをしたいビジネスロジックのオブジェクトモデルです。したがって、データベースを含めることはできませんのデフォルト値です。
E.g.データベースにしているビットの分野:IsANicePerson.この分野に変換するプロパティのクラスです。楽観的であるかな自然に当たって、このプロパティのデフォルト値を'true'.このクラスIの実施この(デフォルトとしての価値isANicePersonバッキングます。いいデフォルト値をデータベースにして複製す。重複コード/論理は悪いものです。そのための私の反対デフォルト値です。
免責事項:いOO-世界-使用Linq2Sql.
これは非常にシンプルでなければなりません。データは、通常、顧客の電話番号またはデフォルト値のように、行ごとに一意である必要がある場合は時間をかけて、最も可能性の高い変更は、その後、私はそれを使用することはありませんでしょう。ことを意味し、それは本当に唯一CREATEDATE、ModifiedDate、またはそのような性質の他の列を充填するのに便利です。
ここで私は個人的には、過去にも私を務めているデフォルト値を使用に関するガイドラインです。次の例では、バックエンドへの読み取り/書き込みアクセス権を持つ複数のアプリケーションとデータベースのバックエンドを検討します。これらのケースでは、データベースは、データをモデル化し、したがって、データの整合性を確保する方法を定義することが不可欠です。
1)とCreatedDateにModifiedDate列。これらの列は、通常、GETDATE()(SQL Serverが)デフォルトとして定義されています。他の記事で述べたように、これらのフィールドは、トリガなどで更新することができます。
2)ブール状態列。例: "のIsDefault"、(監査のために) "IsDeleted"、 "のisActive" など。これらのフィールドの全ては、一般に、データモデルによって定義されるべき論理的なデフォルト状態になります。これに対する例外は明らかにヌル状態がレコードに格納されたデータについて何かを表しNULL可能トライステートブールフィールドになります。
3)データの制約定義:ALLOWNULLと列偽と定義されていないデフォルト=。換言すれば、値がアプリケーションによって必要とされます。
4)ルックアップテーブルの外部キーのアイデンティティ:これはおそらく、当たり前ではなく、たくさんのルックアップテーブルの外部キーのために、私は、レコードの初期状態をカバーしてデフォルトを定義します。したがって、たとえば、「イベント」の表の外部キー列「EventTypeId」(INT-自動インクリメント)は、デフォルトの1を持っていると、「一般的」か何かを表します。これは、例えば、私は特定のタイプのIDに関するイベントが、いけないのケアを記録したい、ほとんどのシナリオをカバーします。
5)非クリティカルな文字列:「説明」、「コメント」など、これらの列のために、私は、一般的なアプリケーションでの取り扱いsimpify System.DbNull => NULLへの変換純粋にデフォルトとして「」を定義します。これは、当該テーブルが数百万行が含まれており、収納スペースが問題である場合は特に、すべてのシナリオに適用できない場合がありますものです。
だから、要約すると、使用のデフォルトはデータベースに保存されている実際のデータのデータの整合性を確保します。データモデルは、それ自体の中に、これらのデータの整合性ルールを定義する必要があり、それと対話する任意のアプリケーションは、これらのルールを尊重することを強制する必要があります。また、これは教義ではなく、常に例外はあるだろうということに注意をしてください。それはあなたのデータベース/アプリケーションのために理にかなっていることを個別ので、それぞれのシナリオを検討します。
確かに灰色の領域。データベースの問題に置くために、古典的などのくらいのビジネスロジックです。
私たちは純粋主義者であることと何のビジネスロジックは、データベースに属していないと言ってみたかったならば、答えはそれらを使用することはありませんことになります。
私たちは、多くの場合、データベースにデフォルトのロジックを実行し、許可するよう、我々は例外を作ることができる実用的なビーイングます。