1 つのディメンション内で重複しない範囲を格納できるデータ構造が必要です。次元の全範囲を完全にカバーする必要はありません。
例としては、会議室のスケジューラーがあります。次元は時間です。2 つのスケジュールが重複することはありません。会議室は常にスケジュールされているわけではありません。つまり、特定の時間に存在できるスケジュールは最大 1 つです。
簡単な解決策は、範囲に開始時刻と終了時刻を格納することです。
Range {
Date start
Date end
}
これは正規化されておらず、コンテナが重複しないようにする必要があります。隣接する 2 つの範囲の場合、前の終了は次の開始と冗長になります。
別のスキームでは、各範囲に 1 つの境界値を格納する必要があります。ただし、範囲の連続したシーケンスでは、範囲よりも 1 つ多くの境界値が常に存在します。これを回避するには、シーケンスを交互の境界値と範囲として表すことができます。
B = 境界値、r = 範囲
ぶんぶん
データ構造は次のようになります。
Boundary {
Date value
Range prev
Range next
}
Range {
Boundary start
Boundary end
}
本質的に、これは交互の型を持つ二重連結リストです。
最終的には、使用するデータ構造が何であれ、メモリ (アプリケーション コード) とリレーショナル データベースの両方で表現されます。
学術的または業界が試みたソリューションが存在することに興味があります。