う強い制約に提供するデータベース?
-
13-09-2019 - |
質問
私はこの質問に思えるかもしれないが、グリーン側が、その後の"エンタープライズ"または"商業"データベースったん始まっております。すべてのメーを制限に提供するデータベース?いかについての詳外部キーの制約ではなく独自の制約をい性能を持益、データの完全性?
っていう驚きのリレーショナルデータベースなしで外部キーを持たなくても指定した主キーで制分野においてnullでない場合または独自の制約を表すクエリー式。
思いの?
解決
"だけ" データの整合性?あなたはそれがマイナーなことだと言うように。すべてのアプリケーションでは、それは重要です。そうです、それはそれを提供し、それは大きな利点です。
他のヒント
データの整合性は、彼らが提供するものです。どちらかといえば、彼らはパフォーマンスコスト(少なくとも非常にマイナーなもの)を持っています。
彼らは、パフォーマンスとデータの整合性の両方を提供し、後者は深刻なシステムにとって最も重要です。私は、任意の外部キーなしでデータベースを参照し、すべての整合性がトリガ(すべてであれば)を介して行われるたびにうんざり。そして、私はそこにそれらのかなりを見ます。
以下のときの制約権の場所:-
- お客様のデータは有効になりますに関して制約
- データベースの知らのデータに対して有効での制約は使用できる場合、この照会および更新のデータベースなど削除する不要な参加のためのクエリー、ビュー)
- の制約が記述されて、将来のユーザーのデータベース
- 違反の制約れに巻き込まれ早;ないにも関係のないプロセスの失敗
関係理論、データベースできるデータ矛盾のようになってい関係データベースです。外部キーに必要なデータの整合性と一貫性を保つのデータベース"関係";すなわち論理モデルのデータベースは、常に正しい。
具体的には、通常容易を定義する外部キーのようになりましたDBエンジンの取扱いについて明らかにし、関係が有効になります。その他のオプションがあります。
- も保証されたデータの破損 ある時点で
- DBをトリガする 通常は遅くなること以下 performant
- アプリケーションコードする 最終的に問題となる場合 また忘れられる権利 コードまたは別のアプリケーションアクセス のデータベースです。
データは資産です。教科書の多くは、それを述べています。
しかし、それは実際には間違っています。それはむしろ、「正しいデータが資産である、誤ったデータが責任ある」と言う必要があります。
とデータベースの制約は、あなたのデータが正しいことを可能な限り最高の保証を与えるます。
いくつかのDBMSにおいて(例えば、オラクル)制約は、実際にの、一部のクエリのの性能を向上させることができます。いくつかの例については、このOracleマガジンの記事を参照してください。
私は必要なすべての制約がデータベース内になければなりませんと言うでしょう。外部キー制約は、使用できないデータを防ぎます。あなたは役に立たないデータベースを使用する場合に限り、彼らは要求している - 彼らは、あると便利ではありません。外部キーは、削除および更新のパフォーマンスを傷つけるかもしれないが、それはOKです。それは、削除を行うには(または、彼はシステムに注文を持っているので、この人を削除しないアプリケーションを伝えるために)少し時間がかかるしたり、ユーザではなく、自分のデータを削除した方が良いですか?外部キーの欠如は、データを照会中に予期しないと、多くの場合、深刻な問題を引き起こす可能性があります。たとえば、コストレポートは、関連データを持つすべてのテーブルに依存してもよいので、1つまたは複数のテーブルを結合するには何もないので、重要なデータを表示するために失敗することがあります。
ユニーク制約もまともなdatabseの要件です。フィールドのフィールドまたはグループが一意である必要がある場合は、データベースleveのでこれを定義するために失敗すると、修正するのは極めて困難なtocreateデータの問題です。
あなたは他の制約に言及していないが、あなたはする必要があります。常にテーブル内のすべてのデータに適用されなければならない任意のビジネスルールは常に(例えば、有効な日付として2009' \ 31 \ '02を受け入れるwillnot datatimeのデータ型など)のデータ型を介してデータベースに適用されるべきで、制約(たとえばフィールドが100より大きい値を有することを可能にする)、またはトリガを介してないものは、ロジックは、それが通常の制約によって処理することができないので、複雑です。 (あなたは何をしているかわからない場合のトリガーは、あなたがこの複雑なロジックを持っているので、もし、あなたがうまくいけば、あなたのチームのプロadatabase持って、書くことは難しいです。)順序が重要になります。データ型は最後の選択肢として、トリガーに続いて制約が続く最初の選択肢、です。
簡単なアプリケーションコード
一つもながるアプリケーションコードしてもしくはエラーチェックおよびバリデーションを実施します。対しこれら二つのビットのコードを掛ける数千人の業務を見ることができがあります。
get department number for employee # it's good coz of constraints
do something with department number
対
get department number for employee
if department number is empty
...
else if department number not in list of good department numbers
....
else
do something with department number
もちろん、人を無視したような制約をいていないのかもしれません出していただきありがとうござい力コードの検証とにかく...:-/
あと、データが得られない場合には制約が変化するので、データベース構成の問題ではないコードに変更。
整合性制約は特に重要です。
あなたは(あなたがいない場合でも、および、少なくとも壊れたデータはそのアプリケーションのみに影響します)適切に単一のアプリケーションのコードでは、データの整合性を管理することができるかもしれませんが、複数のアプリでそれが毛(と少なくとも冗長になります)。
「ああ、データの制約が変更された場合、それはデータベースの構成の問題ではなく、コードの変更の問題だ。」
これは、設計から消え制約でない限り。いくつかのコードが書かれている場合がありますので、その場合には、間違いなくそこにいるその削除制約に依存する、コードへの影響があります。
それは、常にとき「laxing」または任意の宣言の制約を「削除」考慮して撮影する必要があります。
それ以外に、あなたはもちろん、完全に正しいです。