1

こんにちは私はIDと他のいくつかの列を持つ親テーブルと、このID(外部キー)に基づいた多くの値を持つ子テーブルを持っていました。シーケンスである主キーと外部キーとしてのこの親テーブルIDを使用してテーブルを作成したかったのですが、後で、組み合わせて一意性を提供するもう1つの外部キーEMPIDがあることがわかりました。検索とバッチ更新の場合でも、これら2つのFKを組み合わせて使用​​できます。したがって、DBのパフォーマンスを念頭に置いてシーケンスジェネレーターを使用する必要がありますか、それともプライマリ列を削除するだけですか。

4

5 に答える 5

2

そのシーケンス生成キーを絶対に必要としない、または参照したくない (そして他のオブジェクトがその ID を参照しない) ことが確実な場合は、その組み合わせを保証できる限り、それを削除しても安全です外部キーは常に一意の組み合わせを提供します。

パフォーマンスの問題に気付いた場合は、外部キーである列 (組み合わせて主キーとして機能する) にインデックスを付けて、それらの列のクエリのパフォーマンスを向上させることができます。

于 2010-02-18T14:39:02.187 に答える
1

リレーショナル純粋主義者は、順番に生成されるID列はまったく必要ないと言うでしょう。各テーブルの主キーは、各行を一意に識別する列の組み合わせである必要があります。(これを行う列の組み合わせが複数ある場合は、1つを主キーとして選択し、一意の制約を使用して他の列を適用します)。

これが行き詰まりがちなのは、これらの列の1つ以上が大きいか扱いにくい場合、またはそのような列の数が主キー自体を大きくて扱いにくい場合です。ここで、私はリレーショナルピュアリストから脱却し、サロゲートキーを追加します(これは、IDENTITY / Sequence ID列がより適切に呼ばれるものです)。ただし、一意性の制約を使用して、他のキーが引き続き適用されていることを確認してください。

したがって、テーブルにID列が必要な理由はありません。すべてのテーブルに1つ必要な場合は、DB製品が自動的にそれを提供すると思います。

于 2010-02-18T14:52:10.967 に答える
1

(これをコメントに入れたかったのですが、長すぎます。)

理論上、主キーは不変である必要はありません。ただし、現実の世界では、変更可能な主キーを持つことは、次の 2 つの理由から悪夢です。

  1. リレーショナル モデルが大きくなるにつれて、すべての子テーブルに親の主キーのすべての列を含める必要があります。
  2. 主キーは、すべての一意の制約と同様に、インデックスによって適用されます。
  3. 一部の DBMS では、このような自然キー構造を満たすのに十分な列をインデックスに含めることができません。
  4. 同様に、索引キーのデータ長にも長さの要件があります。
  5. 最後に、変更可能な主キーはシステム全体にカスケードする必要があります。

要するに:

キー値変更される可能性がある場合

-- クレジット カード番号や口座番号は、変更される可能性があるため主キーとして不適切です。また、名前を選択するのは本当に不適切です。

また

外部キーを介してこのテーブルに依存するデータがあります(要件が発生したときにこれをリファクタリングするのは非常に簡単です)

それから

主キーとして代理キーを作成します。テーブルの自然キーを見つけたのは素晴らしいことです。それらの列にも一意の制約を設定します。

于 2010-02-18T22:10:00.900 に答える
0

データベース設計にすべての制限と制約を課す方がよいと思います。Oracle DBを使用している場合は、少なくともこれらは便利です。Tom Kyte(askTom fame)を参照してください。彼によると、これらの参照/制約は実行パスを決定する際に使用されます。

クエリの最適化にとって制約がいかに重要であるかに注目するのは興味深いことです。多くの人が制約をデータの整合性の問題と考えていますが、それは事実です。ただし、最適な実行プランを決定するときに、オプティマイザーによっても制約が使用されます。オプティマイザーは入力として受け取ります。

  • 最適化するクエリ
  • 利用可能なすべてのデータベースオブジェクト統計
  • システム統計(利用可能な場合)(CPU速度、シングルブロックI / O速度など-物理ハードウェアに関するメトリック)
  • 初期化パラメータ
  • 制約

最終的には、パフォーマンスが向上する可能性があります。

于 2010-02-18T15:24:43.250 に答える
0

一貫性を保つために、すべてのテーブルに代理キー(自動生成されたID /シーケンスされた主キー)を含めるのが好きです。オーバーヘッドは最小限であり、データベース構造との一貫したプログラマーインターフェイスを可能にします。

于 2010-02-18T15:04:40.593 に答える