ファクト テーブルでは pk が必要ないという参考文献をいくつか聞いたことがあります。すべてのテーブルに pk が必要だと思います。
pk がなく、10 個以上の外部キーがない場合、ファクト テーブルの行をどのように理解できますか。
ファクト テーブルでは pk が必要ないという参考文献をいくつか聞いたことがあります。すべてのテーブルに pk が必要だと思います。
pk がなく、10 個以上の外部キーがない場合、ファクト テーブルの行をどのように理解できますか。
主キーはそこにあります
...しかし、データベースレベルでprimary key制約を適用する必要はありません。
こう考えると、技術的にユニークキーや主キーとは、各行の特徴を一意に定義するキーです。また、そのエンティティの複数の属性で構成することもできます。ファクト テーブルの場合foreign keys、他のディメンション テーブルからのフローインが一緒になって、すでに複合主キーとして機能しています。そして、これらの外部キーの組み合わせによって、ファクト テーブル内の各レコードを一意に識別できます。したがって、この外部キーの組み合わせは、ファクト テーブルの 主キーです。
では、なぜ代理キーではないのでしょうか?
必要に応じて、ファクト テーブルに代理キーを1 つ定義することもできます。しかし、それはどのような目的に役立つのでしょうか? その代理キーを参照して、そのファクト テーブルから 1 つのレコードを取得することは決してありません (代わりにインデックスを使用してください)。その代理キーを使用してファクトを他のテーブルと結合することもありません。このような代理キーは、データベース内のスペースを完全に無駄にします。
データベース制約の適用
この概念的な主キーをデータベース レベルで定義する場合、データベースは、その上で実行される DML 操作のいずれにおいても、この制約が違反されないようにする必要があります。この制約を確実にすることは、データベースのオーバーヘッドです。OLTP システムでは問題にならない可能性がありますが、データがバッチでロードされる大規模な OLAP システムでは、パフォーマンスが大幅に低下する可能性があります。さらに、データの読み込みフェーズ自体で (通常は ETL コーディングによって) 制約の整合性を確保できるのに、データベースで制約の整合性を確保する必要があるのはなぜですか。
原則として、ファクト テーブルにはキーが必要です。データモデリングの観点から、これは必須です。ただし、実装では、データベースのキー制約には通常、インデックスが必要です。インデックスの作成と維持のオーバーヘッドは、「キー」属性の一意性が、データベース内の制約ではなく、統合レイヤー (「ETL プロセス」) の制御によって維持される場合があるようなものです。
実用的な場合はいつでも、データベース内にキー制約を作成することは理にかなっています。キーがデータベースで明示的に定義されていない場合は、ユーザーがデータの意味を理解できるように明確に文書化する必要があります。
他の回答で読むことができるように、主キーの制約は必要ありません。ファクトテーブルの代理キーは物理レベルで役立つ場合があります。
ファクト テーブル サロゲート キーの Kimball 設計のヒントを次に示します。
ファクト テーブル内の行に代理キーを割り当てると便利な状況がいくつかあります。
場合によっては、組織のビジネス ルールによって、ファクト テーブルに複数の同一の行が存在することが合法的に許可されることがあります。通常、設計者は、ソース システムで何らかのトランザクション タイム スタンプを検索して行を一意にすることで、これを回避しようとします。しかし、時折、この望ましくない入力を受け入れざるを得なくなることがあります。このような状況では、同一の行をロードできるように、ファクト テーブルの代理キーを作成する必要があります。
ファクト行を更新するための特定の ETL 手法は、代理キーがファクト行に割り当てられている場合にのみ実行可能です。具体的には、ファクト行に更新をロードする 1 つの手法は、更新する行を新しい行として挿入し、次に元の行を 1 つのトランザクションとして 2 番目のステップとして削除することです。ETL の観点から見たこの手法の利点は、ロード パフォーマンスの向上、回復機能の向上、および監査機能の向上です。更新された行が挿入されてから古い行が削除されるまでの間に、更新されたファクト行の古いバージョンと新しいバージョンに対して複数の同一の主キーが存在することが多いため、ファクト テーブル行の代理キーが必要です。
同様の ETL 要件は、読み込みジョブが中断された場所を正確に特定して、読み込みを再開するか、ジョブを完全に元に戻すことです。順次割り当てられた代理キーにより、このタスクは簡単になります。