複合キーにおけるシリアル番号付けの課題への対処
データベース管理では、特に複合キーを扱う場合、行グループ内に連続番号を割り当てることが必要になることがよくあります。 これは、特に複数のトランザクションにわたって連続した番号付けを保証する場合、またはデータ削除後に行う場合には注意が必要です。 一般的なシナリオ、つまり個人の住居の移動を追跡する住所履歴テーブルを検討してみましょう。 各エントリには、個人 ID、シーケンス番号、タイムスタンプ、および住所の詳細が含まれます。目標は、一意の人物ごとに 1 から始まるシーケンス番号を自動的に生成することです。
伝統的な方法とその限界
計算列やシーケンス ジェネレーターなどの従来のアプローチでは不十分な場合があります。 同時トランザクションや行の削除により、番号付けシーケンスにギャップが簡単に生じる可能性があります。
優れたアプローチ: ウィンドウ関数
より堅牢なソリューションはウィンドウ関数を活用します。 row_number()
関数は、定義されたパーティション内で連続番号を効率的に生成します。 個人 ID に基づいて分割することにより、各個人に一意のシーケンス番号が保証されます。
row_number()
これを実装するには、adr_nr
テーブルに新しい列 address_history
を追加します。 次のクエリを使用してデータを入力します:
<code class="language-sql">CREATE VIEW address_history_nr AS SELECT *, row_number() OVER (PARTITION BY person_id ORDER BY address_history_id) AS adr_nr FROM address_history;</code>
これにより、その adr_nr
とその person_id
のパーティション内の位置を考慮して、各行の person_id
が生成されます。これにより、行の順序が変更されても、一意のシリアル番号が確保されます。
データの整合性に関するベスト プラクティス
番号付け以外にも、次のベスト プラクティスを覚えておいてください。
timestamp
または timestamptz
)。original_address
のような冗長データを保存しないでください。以上がウィンドウ関数は複合キーのシリアル番号付けの課題をどのように解決できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。