1

リレーショナル キー (主キーと外部キー) を使用せずに 2 つのテーブルを結合できるため、そもそもこれらのキーを定義する目的は何ですか?

たとえば、私の最初のテーブルは

customer table
fields are cust_id, lastname, firstname

私の2番目のテーブルは

product table
fields are product_id, productno, cust_id

どのフィールドも主キーまたは外部キーとして宣言していませんが、2 つのテーブルを結合できます。

SELECT *
FROM customer c
LEFT OUTER JOIN product p ON p.custid=c.cust_id

では、なぜキーを定義する必要があるのでしょうか。

4

6 に答える 6

5

いくつかの良い答えがありました。少し推測させてください。

「dasblinkenlight」が述べているように、検索の速度 (データベースは 2 つのテーブル間の関係を事前に認識しており、クエリを最適化できる可能性があります)、さらに重要なのは参照/データの整合性です。

2つ目についてもう少し話しましょう。

次の 3 つのテーブルがある単純なシナリオを考えてみましょう (私はこれを単純化しました。実際には、多くの製品を注文することができますが、簡潔にするために単純にしています)。

CustomerTable
   ID
   FirstName
   LastName


OrderTable
   ID
   CustomerID
   ProductID    

ProductTable
   ID
   Description

外部キーがなければ、次のことが自由にできます。

  • 商品のない注文を作成する
  • 顧客なしで注文を作成する
  • 注文のある顧客を削除する
  • 商品などを含む注文を削除...

これは災害のレシピです

外部キーを使用することで、上記を次のように再設計できます。

CustomerTable
   ID
   FirstName
   LastName


OrderTable
   ID
   CustomerID -> References CustomerTable.ID
   ProductID -> References ProductTable.ID

ProductTable
   ID
   Description

CustomerID と ProductID が「NOT NULL」であることを指定できます (他の列と同様)。これは、注文を作成することを意味します既存の顧客と既存の製品が必要です。優秀な!

しかし、それは良くなります。商品の削除を開始するとどうなりますか? いくつかのカスケード オプションを指定していない限り (これを参照)、データベースはぐらつきをスローし、「いいえ。それは削除できません。何かによって参照されています」と言います。

これは、方程式のデータ整合性の部分です。そこにないものを指すことはできません (外部キーは、[null が許可されている場合] またはそこにあるものを指すことを主張します。主キーはこれに役立ちます)。

突然、データベース自体が、すべてがうまく連携し、うまく結びついていることを確認します。それがなければ、すべての注文を削除したり、製品を削除したり、必要なものをすべて削除したりできます。すると、アプリケーションは一体何が起こっているのか疑問に思うでしょう。

それらを使用してください:)

于 2013-03-27T20:38:12.407 に答える
3

2 つのキーが関連していることを RDBMS に通知する 2 つの理由は次のとおりです。

  • 検索の高速化 - RDBMS は、主キーと外部キーの関係を宣言するときに結合を高速化するために暗黙的なインデックスを追加する場合があります
  • 参照整合性の処理 - RDBMS は主キーの削除をチェックして、「子」レコードから参照されている行を削除しているかどうかを確認し、オプションで子レコードを削除するか、エラーをスローすることができます。親テーブルに一致する主キーがない外部キーを持つレコードを挿入しようとすると、RDBMS からも通知されます。

それ以外は、キーと非キー フィールドは同様の方法で使用できます。特に、主キーまたは外部キーとして宣言されていない列で結合しても問題ありません。

于 2013-03-27T20:29:28.157 に答える
3

「参加できる」ということではなく、テーブルに何を入れることができるかということです。また、顧客を削除しても、データベースに未処理の製品がある場合はどうなりますか? 外部キーがない場合、それらは孤立したレコードと呼ばれるものになります。デフォルトでは、外部キーを追加すると、子テーブルによって参照されるオブジェクトを削除できなくなります。

于 2013-03-27T20:30:27.720 に答える
2

これらの概念はすべて制約に関するものです。

PRIMARY KEYis a 制約は、一連の列が一意であり、一意ではないことを示しますNULL。ほとんどの実装ではこれをサポートするためにインデックスを使用します。一部の実装では、主キーは、ディスク ストレージ内のページ内のデータを並べ替えるためのクラスタリング インデックスでもあります。

AFOREIGN KEYは、列のセットが別のテーブルの別の列のセットを参照することを示す制約です。通常、外部キーは引き続き である可能性がありますがNULL、そうでない場合はNULL、参照するテーブルで有効なキーである必要があり、それも一意である必要があります。参照するキーは PRIMARY KEY である必要はなく、一意のキーである必要はありません (データベースは通常、一意の制約やインデックスなどの制約からこれを決定します)。外部キー自体は必ずしもインデックスを持つ必要はありませんが、参照されているテーブル内の行を削除するには、削除を許可する前にすべての外部キーをチェックする必要があるため、通常はこれを使用することをお勧めします。これらはすべて、参照整合性の概念に該当します。

一般に、データベースに対するすべての制約はデータの整合性を保護し、オプティマイザーが制限を理解し、最適な実行計画に関するより多くの手がかりを得ることができるようにします。ただし、単純にテーブルに適切な一意のインデックスを設定し、主キーの一部として、または外部キー参照を定義する前段階としてインデックスが存在しなくても、同じ実行計画を取得することは可能ですが、インデックスが独自性は確かにプランの選択に影響します。

クエリ (DML) では多くのことが許可されていますが、DDL はデータの構造を宣言します。

于 2013-03-27T20:52:25.600 に答える
1

簡単な答え、データの整合性。

また、このような外部キーを使用すると、より多くのデータがテーブルに入力されるため、検索がはるかに高速になります。

于 2013-03-27T20:29:15.923 に答える
0

結合は「共通変数」でのみ使用されるため、結合を使用して、2 つのテーブルで互いに等しい値を持つテーブルを結合できます。主キーは一意である必要があるため、いつでも参照できます。したがって、これらを他のテーブルからの参照として使用することもできます。基本的に、2 つのテーブルからクエリを実行すると、デカルト積が発生します。(時間が要因であるため、これは実際の実装では発生しません)。これにより多くのデータが生成されますが、結合によって結果のデータが減少します (理論上)。結合の詳細については、次を参照してください。

http://www.w3schools.com/sql/sql_join.asp

于 2013-03-27T20:36:28.847 に答える