2005年 9月 1日 | 履歴 データ (開始日 と 終了日) | >> 目次 (テーマ ごと) |
● QUESTION | 履歴 データ の開始日・終了日を、どのように考えればよいか。 | |
▼ ANSWER | 多義、組 オブジェクト、VE のいずれかとして考えられる。 | |
2010年 9月16日 補遺 |
まず、開始日・終了日の一般的な考えかたを述べてみます。
適用日開始日および適用終了日は、「多義」 です。
{企業 コード、企業名称、・・・}. [ R ]
種別 コード が、たとえば、「1」 が開始を示して、「2」 が終了を示す、ということになるでしょうね。 しかも、範囲を示すので、「開区間」 と 「閉区間」 という点も意識しなければならないでしょう。
(1) 「開区間」 というのは、「 a < x < b 」。ちなみに、数学上、( a, b ) と記述します。 つまり、2005年 7月 6日であれば、「開区間」 なら、「20050706 < x」 ということですから、(「日」 を単位にすれば、) 2005年 7月 7日から適用する、ということです。「閉区間」 なら、「20050706 ≦ x」 ということですから、2005年 7月 6日から適用する、ということです。 「期間限定」 のように──たとえば、夏の或る期間のみ、特別に セールス するとか──、開始日と終了日が、「組」 になっているのであれば、「多義」 として扱うよりも、「組 オブジェクト」 として、以下のようにしたほうが良いかもしれない。 (適用開始日、適用終了日).
さて、この考えかたを 「履歴」 に適用すれば、たぶん、終了日は、いま、使われている データ に関して、基本的には、「null」 として、無限のまま、開区間になっている、というのが、ふつうでしょうね。 しかも、適用開始日・適用終了日は、「多義」 になっているので、以下のようにするのが正しいでしょうね。
{企業 コード、企業名称、・・・}.[ R ] もし、適用開始日・適用終了日が、あらかじめ計画された日であれば──事前に入力されるのであれば、開始日および終了日は、「できごと」 が起こった日付ではなくて、企業 データ を登録するための日付であって、企業 データ に帰属する データ 項目として考えますが──、「名称」 などの データ 項目と同じ扱いにしますが──、もし、履歴 データ のすべてが、(履歴状態と最新状態というような区分をしないで、) 並列的に扱われ、更新する 「できごと」 を記録するのであれば、(「適用」 という) 「VE」 として考えるのがよいでしょう。(以下、とりあえず、VE として考えてみます。) そして、日付は、たぶん、「期間限定」 のような 「日付を組とした」 構成ではないので、開始日と終了日を切り離すのが正しいでしょうね。終了日は、「VE の VE」 です──「設立日」 と 「解散日」 の現象を思い出してください。
{企業 コード、企業名称、・・・}. [ R ] ただし、上述した考えかたは、たとえば、以下に示すように、企業 コード (の値) そのものが変わることを前提にしています。
{A、・・・}.
{A’、・・・}. もし、企業 コード そのものが同じで、アトリビュート のみが変更されたのであれば、「適用」 は、個体 (企業) に対する指示しかしていないので、「履歴番号」 を使わざるを得ないでしょうね。
{A、履歴01・・・}.
{A、履歴02・・・}. ただ、もし、適用日が、「閉区間」 として、あらかじめ入力されるのであれば──つまり、期間が限定されているので、「組 オブジェクト」 として考えて──、(「適用」 という 「できごと」 を認知しているのではなくて、「備考」 という データ 項目と同じような扱いになり、) 企業に帰属する性質として観ているので、「履歴番号」 はいらないでしょうね。
{A、・・・} なお、適用開始日のみ、あるいは、適用終了日のみを使うやりかたも考えられます。たとえば、
{企業 コード、企業名称、・・・}. [ R ] 履歴の先行・後続のなかで、先行する履歴 データ の適用開始日を 「終了日」 とするように 「半閉区間」 を考えます。 適用開始日 ≦ x < 後続する履歴 データ の適用開始日 あるいは、 先行する履歴 データ の適用終了日 < x ≦ 適用終了日 たとえば、
{A、履歴01・・・}.
{A、履歴02・・・}. もし、そうであれば、(この日付を、適用開始日とすれば、) A 履歴01 は、2005年 6月28日から2005年 7月 5日まで使われた、ということを示します。あるいは、(この日付を、適用開始日とすれば、) A 履歴02 は、2005年 6月29日から2005年 7月 6日まで使われた、ということを示します。 ちなみに、「日付 < high-value」 を問うことのできない RDB もあるので、注意してください(たとえば、PostgreSQL は、できない)。開始日と終了日の 2つとも使用するか、もしくは、開始日のみあるいは、終了日のみを使用するか、という判断は、どちらでもいいでしょう (笑)。やりやすいほうを使ってください。 なお、「最新と履歴」 に割るやりかたは、たぶん、以下のような構造を意識しているのでしょう。
{企業 コード、・・・}. [ 最新状態 ] もし、最近状態のみを、常時、使い、履歴は、法律の規制のなかで、或る一定期間のあいだ、記録として遺しておかなければならないとか、たとえば、万が一、トラブル などが起こったときに、たまに、参照する、というのであれば、この構造は正しい。 ただ、履歴が、最新状態と同じように、つねに、商品の状態遷移を参照するために使われるのであれば──たとえば、(料金変更を前提にした) 料金計算とか──履歴は、以下に示すように、最新といっしょにして扱うべきでしょうね。
{企業 コード、履歴番号、・・・} [ R ]. ちなみに、「VE」 は、以下のように、実装のとき、派生もとに戻しても良い。 {企業 コード、履歴番号、適用開始日、適用終了日}. でも、「INDEX-only」 を前提にするのなら──「INDEX-only」 の join を前提にするのなら──、以下のように、「VE」 のままでよいでしょう。
{A、履歴01・・・}.
{A、履歴02・・・}. ただ、「INDEX-only」 の演算がわずらわしいのであれば、以下のように 「VE」 を戻してもいいでしょう。
{A、履歴01、20050628、20050706}. ただし、「null」 が起こるので、注意されたい──このときの 「null」 は、一義でしかないので──最新状態しか示さないので、「null」 の扱いが混乱を生じることはない、と思います。 さて、ことさように、「開始日と終了日」 の扱いは、意味論的観点に立てば、一様ではないのです。そして、なかなか、むずかしい考慮点なのです。単純に考えて、以下の 「構造」 であればよい、という訳ではないのです。 {企業 コード、・・・、適用開始日、適用終了日}. 逆の言いかたをすれば、以下に示す「意味」の違いを言うことができますか。
(1) {企業 コード、・・・}. [ R ] (2) {企業 コード、・・・(適用開始日、適用終了日)}.
(3) {企業 コード、・・・} [ R ]
(4) {企業 コード、履歴番号、・・・} [ R ]. 以上に示した 「意味」 の違いを、すぐに、言えないようでしたら、もう一度、本文を読んでみてください。 |
[ 補遺 ] (2010年 9月16日)
補足説明は取り立てて いらないでしょう。 |
<< もどる | HOME | すすむ >> | |
▼ データ解析に関するFAQ |