データベースに順序付きデータを格納する方法

2698 ワード

データベース内のレコードはすべて集合的に組織されており、1つのレコードセットの各レコードは無秩序であることが多い(または、データベースに格納された順序などのデフォルトの順序があるが、このような順序を絶対に保証することはできない).実際のアプリケーションでは、リストのような順序のあるデータをデータベースに格納する必要がある場合、どのようなポリシーをとるべきでしょうか.
1つの直接的で効果的な方法は、レコードセット(またはテーブル)に「順序」列(または「インデックス」フィールド)を追加し、テーブルを格納、取り出し、またはソートする操作を行う場合、「インデックス」フィールドに基づいて完了し、データの正しい順序を保証することです.
        content     order

        -------------------- 

           A         1 

           B         2 

           C         3 


この方法の原理は非常に簡単で、しかも確実に直接有効であることがBest way to save a ordered List to the Database while keeping the orderingで認められている.
上記の方法を使用する問題の1つは、既存の順序付けレコードの間に新しいレコードを挿入する場合、すべてのインデックスフィールドの値をリフレッシュする必要があります.すなわち、挿入後の正しい順序を保証するために、すべてのレコードを並べ替える必要があります.テーブルのレコードが多い場合、レコードを挿入するたびに、大きな再配置消費が発生します.
このような「再排出消費」を解決(または緩和)する方法は、単純な整数値(0,1,2,3,...)を採用しないことである.「インデックス」フィールドとしては、('a','aa','ab',...,'b','ba','bb',...,'c',...)と同様に使用されます.を選択します.
この方法(私が一応「string approach」と呼ぶ)の原理は以下の通りである.
(1)テーブルに「a」、「b」、「c」の順に格納されたデータA、B、Cが既に存在するとする.
        content     order

        -------------------- 

           A         'a' 

           B         'b' 

           C         'c' 


(2)表中のAとBの間にDを挿入し、対応するorderフィールドを「aa」に設定し、既存のA、B、Cのorderフィールドを一定に保つことができる.
        content     order

        -------------------- 

           A         'a' 

           D         'aa'     (new added)

           B         'b' 

           C         'c' 


この方法は私がStore ordered list in database (Gap approach)で見たもので、「gap approach」というもう一つの方法にも言及しました.「順序」列にスパンのある(不連続な)フィールド値(例えば100200300,...)を設定し、次に挿入するレコードに使用可能な「順序」フィールドの値を予約します.
        content     order          content     order

        --------------------       -------------------- 

           A         100              A         100 

           B         200              D         150 (new added)

           C         300              B         200 

                                      C         300 


「string approach」でも「gap approach」でも、挿入レコードが増えるにつれて、ある程度制限があります.「string approach」の場合、文字列が長すぎる可能性があります.「gap approach」の場合、予約されたスパン領域は常に使用済みになります.これらの制限を回避するためには、テーブル内のレコードを定期的に整理し、「順序」フィールドを統一的に編成し直す必要があります.これにより、次のラウンドでテーブルに新しいレコードを挿入する場合、「順序」フィールドの値も冗長ではなく、より簡単で効率的になります.