主キーの何が特別ですか?
スキーマ内のテーブルの目的は何ですか?テーブルのキーの目的は何ですか?主キーの何が特別ですか?主キーに関する議論は、主キーがテーブルの一部であり、そのテーブルがスキーマの一部であるという点を逃しているようです。テーブルとテーブルの関係に最適なものが、使用されるキーを駆動する必要があります。
テーブル(およびテーブルの関係)には、記録する情報に関する情報が含まれています。これらの事実は、自己完結的で、意味があり、容易に理解でき、矛盾しないものでなければなりません。設計の観点からは、スキーマに追加またはスキーマから削除された他のテーブルは、問題のテーブルに影響を与えるべきではありません。情報だけに関連するデータを保存する目的がなければなりません。テーブルに何が格納されているかを理解するには、科学的研究プロジェクトを行う必要はありません。同じ目的で保存されたファクトを複数回保存することはできません。キーは一意の記録される情報の全体または一部であり、主キーは、テーブルへの主アクセスポイントとなる特別に指定されたキーです(つまり、挿入だけでなく、データの一貫性と使用方法のために選択する必要があります)パフォーマンス)。
- サイド:アプリケーションプログラマー(私は時々)が設計および開発しているほとんどのデータベースの残念な副作用は、アプリケーションまたはアプリケーションフレームワークに最適なものが、テーブルの主キーの選択を左右することが多いということです。これにより、整数およびGUIDキー(アプリケーションフレームワークで簡単に使用できるため)とモノリシックテーブルデザイン(メモリ内のデータを表すために必要なアプリケーションフレームワークオブジェクトの数が減るため)が生まれます。これらのアプリケーション主導のデータベース設計の決定は、大規模に使用すると、データの一貫性に関する重大な問題を引き起こします。この方法で設計されたアプリケーションフレームワークは、当然、一度に1つのテーブルを設計します。「部分的なレコード」はテーブルに作成され、時間の経過とともにデータが入力されます。アプリケーションが正しく機能しない場合、マルチテーブルの相互作用が回避されるか、使用するとデータの一貫性が失われます。これらの設計は、意味のない(または理解が難しい)データ、テーブルに広がるデータ(現在のテーブルを理解するために他のテーブルを参照する必要があります)、および重複データにつながります。
主キーは必要なだけ小さくする必要があると言われていました。キーは必要なだけ大きくすべきだと私は言うでしょう。無意味なフィールドをテーブルにランダムに追加することは避けてください。ランダムに追加された無意味なフィールドからキーを作成するのはさらに悪いことです。特に、別のテーブルから非主キーへの結合依存関係が破壊される場合はなおさらです。これは、テーブルに適切な候補キーがない場合にのみ妥当ですが、これがすべてのテーブルに使用された場合、スキーマ設計が不十分であることを示しています。
また、主キーの更新は常に問題外であるため、主キーを変更しないでください。ただし、更新は削除とそれに続く挿入と同じです。このロジックでは、1つのキーを持つテーブルからレコードを削除してから、2番目のキーを持つ別のレコードを追加しないでください。代理主キーを追加しても、テーブルに他のキーが存在するという事実は削除されません。テーブルの非主キーを更新すると、サロゲートキーを介して他のテーブルがその意味に依存している場合(たとえば、ステータスの説明が「処理済み」から「キャンセル済み」に変更されたサロゲートキーを持つステータステーブル)、データの意味が破壊される可能性があります'間違いなくデータが破損します)。常に問題とすべきではないのは、データの意味を破壊することです。
そうは言っても、今日のビジネスに存在する多くの不適切に設計されたデータベース(無意味な代理キー付きデータ破損-1NF巨人)には感謝しています。これは、適切なデータベース設計を理解している人々に無限の労力が費やされることを意味します。 。しかし、悲しいことに、それは時々私をシーシュポスのように感じさせますが、私は彼が401kの1つの問題を抱えていたと思います(クラッシュ前)。重要なデータベース設計の質問については、ブログやWebサイトから離れてください。データベースを設計している場合は、CJ Dateを検索してください。Celko for SQL Serverを参照することもできますが、それは最初に鼻をかざした場合に限られます。Oracle側では、Tom Kyteを参照してください。