2005年 9月 1日 履歴 データ (開始日 と 終了日) >> 目次 (テーマ ごと)
  ● QUESTION   履歴 データ の開始日・終了日を、どのように考えればよいか。
  ▼ ANSWER   多義、組 オブジェクト、VE のいずれかとして考えられる。
2010年 9月16日 補遺  



 まず、開始日・終了日の一般的な考えかたを述べてみます。

 
(1) 「多義」

 適用日開始日および適用終了日は、「多義」 です。
 つまり「日付」 が、2つの 「意味」 (開始と終了) として使われています。
 したがって、「繰返項目」 ですので、1つずつ、ばらばら にします。

 {企業 コード、企業名称、・・・}. [ R ]
 {企業 コード (R~、種別 コード、日付}. [ MO ]

 種別 コード が、たとえば、「1」 が開始を示して、「2」 が終了を示す、ということになるでしょうね。
 ただ、日付なら、時系列として、並びが成立するので、種別 コード は、いらないかもしれない──日付が 1つしかないときには、開始日であり、2つあれば、開始日と終了日というふうにしてもよいかもしれない。

 
(2) 「開区間」 と 「閉区間」

 しかも、範囲を示すので、「開区間」 と 「閉区間」 という点も意識しなければならないでしょう。

 (1) 「開区間」 というのは、「 a < x < b 」。ちなみに、数学上、( a, b ) と記述します。
 (2) 「閉区間」 というのは、「 a ≦ x ≦ b 」。ちなみに、数学上、[ a, b ] と記述します。

 つまり、2005年 7月 6日であれば、「開区間」 なら、「20050706 < x」 ということですから、(「日」 を単位にすれば、) 2005年 7月 7日から適用する、ということです。「閉区間」 なら、「20050706 ≦ x」 ということですから、2005年 7月 6日から適用する、ということです。

 
(3) {開始日、終了日} の 「組 オブジェクト」

 「期間限定」 のように──たとえば、夏の或る期間のみ、特別に セールス するとか──、開始日と終了日が、「組」 になっているのであれば、「多義」 として扱うよりも、「組 オブジェクト」 として、以下のようにしたほうが良いかもしれない。

   (適用開始日、適用終了日).

 
 以上が、開始日・終了日の基本的な考えかたです。

 
「多義」 か 「VE」 か。

 さて、この考えかたを 「履歴」 に適用すれば、たぶん、終了日は、いま、使われている データ に関して、基本的には、「null」 として、無限のまま、開区間になっている、というのが、ふつうでしょうね。
 そして、更新があれば、「閉区間」 となる、というふうに考えるのが、ふつうでしょうね。

 しかも、適用開始日・適用終了日は、「多義」 になっているので、以下のようにするのが正しいでしょうね。

  {企業 コード、企業名称、・・・}.[ R ]
  {企業 コード (R)、日付}.[ MO ]

 もし、適用開始日・適用終了日が、あらかじめ計画された日であれば──事前に入力されるのであれば、開始日および終了日は、「できごと」 が起こった日付ではなくて、企業 データ を登録するための日付であって、企業 データ に帰属する データ 項目として考えますが──、「名称」 などの データ 項目と同じ扱いにしますが──、もし、履歴 データ のすべてが、(履歴状態と最新状態というような区分をしないで、) 並列的に扱われ、更新する 「できごと」 を記録するのであれば、(「適用」 という) 「VE」 として考えるのがよいでしょう。(以下、とりあえず、VE として考えてみます。)

 そして、日付は、たぶん、「期間限定」 のような 「日付を組とした」 構成ではないので、開始日と終了日を切り離すのが正しいでしょうね。終了日は、「VE の VE」 です──「設立日」 と 「解散日」 の現象を思い出してください。

  {企業 コード、企業名称、・・・}. [ R ]
        ┼
        |
        |
        ┼
  {企業 コード (R)、適用開始日}. [ VE ]
        ┼
        |
        ○
        ┼
  {企業 コード (R)、適用終了日}. [ VE ]

 
 以上が、「TM および TM’ の文法に従って」 記述した構造です。

 
「認知番号の変更」 か 「アトリビュート の変更」 か。

 ただし、上述した考えかたは、たとえば、以下に示すように、企業 コード (の値) そのものが変わることを前提にしています。

 {A、・・・}.
 {A (R)、20050628}.
 {A (R)、20050706}.

 {A’、・・・}.
 {A’(R)、20050707}.

 もし、企業 コード そのものが同じで、アトリビュート のみが変更されたのであれば、「適用」 は、個体 (企業) に対する指示しかしていないので、「履歴番号」 を使わざるを得ないでしょうね。

 {A、履歴01・・・}.
 {A (R)、履歴01 (R)、20050628}.
 {A (R)、履歴01 (R)、20050706}.

 {A、履歴02・・・}.
 {A (R)、履歴02 (R)、20050707}.

 ただ、もし、適用日が、「閉区間」 として、あらかじめ入力されるのであれば──つまり、期間が限定されているので、「組 オブジェクト」 として考えて──、(「適用」 という 「できごと」 を認知しているのではなくて、「備考」 という データ 項目と同じような扱いになり、) 企業に帰属する性質として観ているので、「履歴番号」 はいらないでしょうね。

 {A、・・・}
   |
   × null (適用終了日)
   |
   ├{A、名称 a、20050628、20050706}. [ 履歴状態 ]
   |
   └{A、名称 b、20050707}. [ 最新状態 ]

 
「開始日・終了日の 2つ」 か 「開始日/終了日のいずれ」 か。

 なお、適用開始日のみ、あるいは、適用終了日のみを使うやりかたも考えられます。たとえば、

 {企業 コード、企業名称、・・・}. [ R ]
 {企業 コード (R)、適用開始日}. [ VE ]

 履歴の先行・後続のなかで、先行する履歴 データ の適用開始日を 「終了日」 とするように 「半閉区間」 を考えます。

     適用開始日 ≦ x < 後続する履歴 データ の適用開始日

     あるいは、

     先行する履歴 データ の適用終了日 < x ≦ 適用終了日

 たとえば、

 {A、履歴01・・・}.
 {A (R)、履歴01 (R)、20050628}.

 {A、履歴02・・・}.
 {A (R)、履歴02 (R)、20050706}.

 もし、そうであれば、(この日付を、適用開始日とすれば、) A 履歴01 は、2005年 6月28日から2005年 7月 5日まで使われた、ということを示します。あるいは、(この日付を、適用開始日とすれば、) A 履歴02 は、2005年 6月29日から2005年 7月 6日まで使われた、ということを示します。

 ちなみに、「日付 < high-value」 を問うことのできない RDB もあるので、注意してください(たとえば、PostgreSQL は、できない)。開始日と終了日の 2つとも使用するか、もしくは、開始日のみあるいは、終了日のみを使用するか、という判断は、どちらでもいいでしょう (笑)。やりやすいほうを使ってください。

 
「最新・履歴を割る」 か 「最新・履歴をいっしょにする」 か。

 なお、「最新と履歴」 に割るやりかたは、たぶん、以下のような構造を意識しているのでしょう。

 {企業 コード、・・・}. [ 最新状態 ]
 {企業 コード、(履歴番号)・・・、適用開始日、適用終了日}. [ 履歴状態 ]

 もし、最近状態のみを、常時、使い、履歴は、法律の規制のなかで、或る一定期間のあいだ、記録として遺しておかなければならないとか、たとえば、万が一、トラブル などが起こったときに、たまに、参照する、というのであれば、この構造は正しい。

 ただ、履歴が、最新状態と同じように、つねに、商品の状態遷移を参照するために使われるのであれば──たとえば、(料金変更を前提にした) 料金計算とか──履歴は、以下に示すように、最新といっしょにして扱うべきでしょうね。

 {企業 コード、履歴番号、・・・} [ R ].
 {企業 コード (R)、履歴番号、適用開始日} [ VE ].
 {企業 コード (R)、履歴番号、適用終了日} [ VE ].

 
「VE を戻すか」 か 「VE のままにする」 か。

 ちなみに、「VE」 は、以下のように、実装のとき、派生もとに戻しても良い。

 {企業 コード、履歴番号、適用開始日、適用終了日}.

 でも、「INDEX-only」 を前提にするのなら──「INDEX-only」 の join を前提にするのなら──、以下のように、「VE」 のままでよいでしょう。

 {A、履歴01・・・}.
 {A (R)、履歴01 (R)、20050628}.
 {A (R)、履歴01 (R)、20050706}.

 {A、履歴02・・・}.
 {A (R)、履歴02 (R)、20050707}.

 ただ、「INDEX-only」 の演算がわずらわしいのであれば、以下のように 「VE」 を戻してもいいでしょう。

 {A、履歴01、20050628、20050706}.
 {A、履歴02、20050707、null}.

 ただし、「null」 が起こるので、注意されたい──このときの 「null」 は、一義でしかないので──最新状態しか示さないので、「null」 の扱いが混乱を生じることはない、と思います。

 
まとめ

 さて、ことさように、「開始日と終了日」 の扱いは、意味論的観点に立てば、一様ではないのです。そして、なかなか、むずかしい考慮点なのです。単純に考えて、以下の 「構造」 であればよい、という訳ではないのです。

     {企業 コード、・・・、適用開始日、適用終了日}.

 逆の言いかたをすれば、以下に示す「意味」の違いを言うことができますか。

 (1) {企業 コード、・・・}. [ R ]
     {企業 コード (R)、種別 コード、適用日}. [ MO ]
     (ただし、種別 コード は、「1」 が 「開始」 を示し、「2」 が 「終了」 を示す。

 (2) {企業 コード、・・・(適用開始日、適用終了日)}.

 (3) {企業 コード、・・・} [ R ]
     {企業 コード (R)、適用開始日}. [ VE ]
     {企業 コード (R)、適用終了日}. [ VE ]

 (4) {企業 コード、履歴番号、・・・} [ R ].
     {企業 コード (R)、履歴番号、適用開始日}. [ VE ]
     {企業 コード (R)、履歴番号、適用終了日}. [ VE ]

 以上に示した 「意味」 の違いを、すぐに、言えないようでしたら、もう一度、本文を読んでみてください。

 



[ 補遺 ] (2010年 9月16日)

 補足説明は取り立てて いらないでしょう。





  << もどる HOME すすむ >>
  データ解析に関するFAQ