ホームページ > データベース > mysql チュートリアル > ウィンドウ関数は複合キーのシリアル番号付けの課題をどのように解決できるのでしょうか?

ウィンドウ関数は複合キーのシリアル番号付けの課題をどのように解決できるのでしょうか?

Mary-Kate Olsen
リリース: 2025-01-07 19:51:42
オリジナル
957 人が閲覧しました

How Can Window Functions Solve Serial Numbering Challenges in Compound Keys?

複合キーにおけるシリアル番号付けの課題への対処

データベース管理では、特に複合キーを扱う場合、行グループ内に連続番号を割り当てることが必要になることがよくあります。 これは、特に複数のトランザクションにわたって連続した番号付けを保証する場合、またはデータ削除後に行う場合には注意が必要です。 一般的なシナリオ、つまり個人の住居の移動を追跡する住所履歴テーブルを検討してみましょう。 各エントリには、個人 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート