データベースに順序付きデータを格納する方法
2698 ワード
データベース内のレコードはすべて集合的に組織されており、1つのレコードセットの各レコードは無秩序であることが多い(または、データベースに格納された順序などのデフォルトの順序があるが、このような順序を絶対に保証することはできない).実際のアプリケーションでは、リストのような順序のあるデータをデータベースに格納する必要がある場合、どのようなポリシーをとるべきでしょうか.
1つの直接的で効果的な方法は、レコードセット(またはテーブル)に「順序」列(または「インデックス」フィールド)を追加し、テーブルを格納、取り出し、またはソートする操作を行う場合、「インデックス」フィールドに基づいて完了し、データの正しい順序を保証することです.
この方法の原理は非常に簡単で、しかも確実に直接有効であることが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が既に存在するとする.
(2)表中のAとBの間にDを挿入し、対応するorderフィールドを「aa」に設定し、既存のA、B、Cのorderフィールドを一定に保つことができる.
この方法は私がStore ordered list in database (Gap approach)で見たもので、「gap approach」というもう一つの方法にも言及しました.「順序」列にスパンのある(不連続な)フィールド値(例えば100200300,...)を設定し、次に挿入するレコードに使用可能な「順序」フィールドの値を予約します.
「string approach」でも「gap approach」でも、挿入レコードが増えるにつれて、ある程度制限があります.「string approach」の場合、文字列が長すぎる可能性があります.「gap approach」の場合、予約されたスパン領域は常に使用済みになります.これらの制限を回避するためには、テーブル内のレコードを定期的に整理し、「順序」フィールドを統一的に編成し直す必要があります.これにより、次のラウンドでテーブルに新しいレコードを挿入する場合、「順序」フィールドの値も冗長ではなく、より簡単で効率的になります.
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」の場合、予約されたスパン領域は常に使用済みになります.これらの制限を回避するためには、テーブル内のレコードを定期的に整理し、「順序」フィールドを統一的に編成し直す必要があります.これにより、次のラウンドでテーブルに新しいレコードを挿入する場合、「順序」フィールドの値も冗長ではなく、より簡単で効率的になります.