キーを明示的にする必要があるのはなぜですか?


15

私はデータベースの主題について非常に新しいので、これは無知に聞こえるかもしれませんが、テーブル内でキーを明示的にする必要がある理由を知りたいです。これは主に、指定された列の値が(できれば)各行内で一意であることが保証されていることをユーザーに伝えるためですか?言及されていない場合でも、一意性は存在する必要があります。


一意のキーを持っているのに、なぜプライマリキーを持っているのが面倒なのでしょうか?
ベレース

1
なぜ彼らはまったく宣言されているのですか?非常に役立つようですが、実際に機能するデータベースが必要ですか?
dsaxton

1
データベースが機能するために必要なわけではありませんが、データを「機能させる」ため、つまり、一貫性を保つために必要です。
アンドリーM

指定されたフィールドがキーであることをデータベースが認識している場合、副作用として、テーブル内のすべての行を調べる必要がある場合よりもはるかに高速にキーを含む行を見つけることができます。インデックスは、データベースが役立つ理由の非常に重要な部分です。
トールビョーンラヴンアンデルセン

回答:


32

CONSTRAINTデータベース内のsは、そのデータベースにアクセスするアプリケーションによって強制されるべきであることを明らかに示唆していますか?

これが悪い(悪い、悪い...)アイデアである理由はたくさんあります。

1)「独自のロール」制約「エンジン」(つまり、アプリケーションコード内)を構築している場合、単にOracle / SQL Server / MySQL / PostgreSQL / <。whoever ...>が費やしたものをエミュレートしているだけです。執筆。彼らのCONSTRAINTコードは、文字通り何百万人ものエンドユーザーによってその年の間テストされてきました。

2)あなたとあなたのチームに敬意を払って、あなたは数年のうちにそれを正しくするつもりはありません- ここから、MySQLコードだけで4000万ドルの費用がかかります。また、MySQLは上記の3つのサーバーの中で最も安価であり、CHECK CONSTRAINTも実装していません。明らかに、RI(参照整合性)を完全に正しくすることは困難です。

私は以前Oracleフォーラムに頻繁に参加していましたが、一部の貧しいマネージャー/プログラマーが彼の前に仕事をしていた天才があなたが提案することを「明るい」考えにしたプロジェクトを彼に押し付けた回数を話すことはできません。

ジョナサンルイス(彼はOracleオプティマイザーの基礎に関する550ページの本を書いた)は、いいえと答えています。別の本(「テイルズオブジオークテーブル」-オークテーブルはOracleの専門家グループ)にある彼の設計災害の2

  1. Oracleの制約チェック機能を利用する代わりに、アプリケーションレベルでデータの整合性をチェックします。

3)何らかの奇跡によってRIを適切に実装できたとしても、そのデータベースにアクセスするアプリケーションごとに何度も完全に再実装する必要があります。データが重要な場合は、新しいアプリケーションが必要になります。これをパラダイムとして選択すると、あなたとあなたの仲間のプログラマー(サポートスタッフとセールスは言うまでもありません)が絶え間ない消火と悲惨な生活を送ることになります。

あなたは、複数のアプリケーションレベルでのデータの制約を実装する理由について読み狂気の何も短くなることができ、ここでここここ

具体的に質問に答えるには:

なぜ彼らはまったく宣言されているのですか?非常に役立つようですが、機能するデータベースが実際に必要ですか?

理由KEYS(いずれかPRIMARYFOREIGNUNIQUEまたは普通のINDEXことがある一方、ES)が宣言されているが、それである厳密ではない、それは機能のためにそれらを持っているデータベースのために必要な、それは絶対に彼らは機能にそれを宣言するために必要十分


1
ご回答有難うございます。私はおそらくそれを完全に理解するためにもっと学ぶ必要があるでしょう。(私は実際にはチームに属していません。私は単に好奇心からデータベースについて学んでいます。)
dsaxton

2
いくつかの本(Date、Garcia-Molina ...)を読んで、特定の質問がある場合はここに戻ってきてください(ここでは、広すぎる質問はトピック外と見なされます)。psフォーラムへようこそ:-)
ベレース

私は、今までにあなたが入れないことを示唆したことがないだろうが何のデータベースで制約を使用すると、(サービス指向アーキテクチャすべてのアプリケーションが共有サービスから消費持つことで第3位を避けることができ、(あなたは常に最低限の主キーと外部キーを持っている必要があります) )。(おそらく、データベースで必要な最後の整合性チェックをすべて行うと悪夢になる可能性があるため、複数のコンシューマーについてはおそらく検討する必要があります。すべてのテーブルと行をチェックするトリガーはどこでも考えてください。)
jpmc26

10

データベースにキーを作成すると、DBMSエンジンはキー属性に一意性制約を適用します。これは、少なくとも3つの関連する目的に役立ちます。

  • データの整合性:キー属性に重複データを入力することはできません。したがって、キーへの依存関係はすべて保証されます。
  • 識別:ユーザーは、データを正確に識別および更新する手段としてキーに依存できます。
  • 最適化:属性が一意であるという情報(メタデータ)は、DBMSクエリオプティマイザーで利用できます。この情報により、オプティマイザーは特定の方法でクエリの実行を簡素化して、クエリの実行を高速化できます。

8

既存の優れた回答に1つの側面を追加します:ドキュメント。多くの場合、エンティティを識別するために使用できるキーの種類を確認することが重要です。一意の列の任意の組み合わせが候補キーです。

主キーは、実際には特に有用な概念になる傾向があります。

キーを強制するかどうか(おそらくそうすべきです)文書はそれ自体で価値があります。


1
データベース図!よく知らないソフトウェアについて何か意味のあることを言われたとき、私がいつも最初に行うことは、リレーショナルデータベースを使用しているかどうかを確認し、使用している場合はデータベースダイアグラムを作成しようとすることです。これにより、アプリケーションが動作する情報の優れたアイデアが得られます。残念ながら、私が見たデータベースの90%は外部キーを宣言していないため、ダイアグラムは単なるテーブルのセットです。暗黙的なアプリケーションレベルの外部キーを推測するには、推測と調整が必要です。
reinierpost

1
@reinierpost私は完全に同意します。データは永続的に保持されるため、文書化して整理するのに最も価値のあるオブジェクトです。コードは変更される場合があります。より一時的である傾向があります。
boot4life

@reinierpost- ヨーロッパの大国(大規模-数十億のウィジェット)の鉄道インフラストラクチャ全体にソフトウェアを提供する会社のコンサルティングを受け、「ええと、クエリを実行してFOREIGN KEY定義をチェックし、システムを感じる」。私のクエリはzipを返しました!!! 私のSQLが間違っていたに違いないので、上級プログラマーの一人にこれについて言及しました。プライド(劣らず)彼は「すべての検索は、上にあるため、システムがどのFKSを持っていなかったこと(彼は生まれたばかりの息子を提示しているかのように)発表していないPRIMARY KEY(無関係) - S」。<Doh ...> a la Homer Simpson!
ベレース

5

いくつかの内部アプリケーションコードの代わりにCONSTRAINTを使用する別の理由:

開発者/ dbaがinsert / update / deleteステートメントを使用してDB内のデータを直接変更するとどうなりますか?この場合、アプリケーションに基づいた参照整合性はすべて役に立たなくなります。私は知っています、彼らが何をするか知っているので、RIに煩わされることなく直接データを変更する可能性を好む開発者もいます-少なくともほとんどの時間(しかし常にではありません)

PS:もちろんトリガーを作成することもできますが、通常は非常に遅くなります(制約に比べて)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.