質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

2411閲覧

タイムスタンプとインターバルの違いについて

退会済みユーザー

退会済みユーザー

総合スコア0

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2016/10/15 06:52

データベースにおけるタイムスタンプとインターバルの違いについて質問です。
「達人に学ぶDB設計徹底指南書」という本を読んで勉強しています。
インターバル形式ではタイムスタンプ形式と比べて、なぜデータ変更が頻繁に発生する場合に良いのでしょうか?

もともと市町村コード、市町村名、人口という3つのカラムからなる「市町村」テーブルがあって、市町村コードがA000からA999までの1000個しかない、という場面を想定してください。
レコードを一意に特定するためには、市町村コードだけでは役不足というわけですが、代理キーは使いたくありません。
そこで、自然キーであるタイムスタンプとインターバルのテーブルへの導入を考えるわけですが、インターバルのメリットとして、引用ですが以下のようなメリットがあります。
それに関連する文章も一緒に示しておきます。
「(タイムスタンプ形式では)、2005年、2006年、2007年と、それぞれのタイミングにおける市町村のレコード集合を用意してやるわけです。データのスナップショット(断面)を必要な数だけ用意する方法といってもいいでしょう。それぞれの断面が履歴の役割を果たします。ここで付け加えた「年度」列は、連番という無味乾燥な代理キーと違って、きちんと業務的に意味を持つ列(自然キー)です。」
「このインターバル方法は、タイムスタンプ方式の欠点を克服できます。スナップショット別にデータを持つ必要はなく、データの有効期間が切れたら既存のレコードの「終了年度」に終了期限を入力するだけなので、全体としてレコード数を少なく抑えられます。これはデータ変更が頻繁に発生する場合には大きな利点です。」

これがタイムスタンプです。
タイムスタンプ

そして、こちらがインターバルです。
インターバル

データが頻繁に更新される(私の中ではいくつかの市町村がなくなって、また新しい市町村が追加されるようなものを想定しています)のを想像しても、いまいちインターバル形式の方が良いというのがイメージできません。
例えば、1000個の市町村がなくなって、それと同じだけ追加されるというのを考えると、タイムスタンプ形式ではその年度のレコード数は、その前年のレコード数と変化はありません。
一方で、インターバル形式では、1000個のレコードが新たに追加されることになります。
これのトレードオフはどのように考えれば良いのでしょうか?
インターバル形式は「データ変更が頻繁に発生する場合には大きな利点」みたいですが、これが具体的にイメージできません。
お分かりの方、解説お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

例えば、1000個の市町村がなくなって、それと同じだけ追加されるというのを考えると、タイムスタンプ形式ではその年度のレコード数は、その前年のレコード数と変化はありません。

この認識が違います。「年ごとに市町村とコードの対応を管理する」という目的を達成するためには、タイムスタンプ方式では過去のデータを消すことができません(消してしまうと、過去のコードと市町村の対応が不明となってしまいます)。ということで、毎年存在する全市町村のレコードを追加する必要があります。

投稿2016/10/15 08:10

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/10/15 09:42

回答ありがとうございます。
guest

0

ベストアンサー

事情がよくわかりませんが、当初の設計で主キーとしていた「市町村コード」だけでは市町村を一意に識別できなくなるような何かがあったのですかね。団体同士の合併や分離のケースか。あるいは、1000個のコードを使い切ってしまったので廃止された団体のコードを再利用したいのか。それはともかく、回答します。


タイムスタンプ方式ではデータ変更があるたびに全市町村分のレコードを追加しなければなりませんが、インターバル方式では変更があった市町村のレコードを追加 (古いレコードは終了年度を更新) するだけです。

ちなみに、引用中で「データ変更が頻繁に発生する」と言っている「頻繁」とは、キーの粒度により近い頻度、つまり、ご質問の例だと〈毎年のようにデータ変更がある〉という意味でしょう (例を挙げると、国勢調査による人口は5年に一度しか発表がありませんが、住民基本台帳に基づく人口は毎年発表されています)。

さらに、市町村によって変更時期が異なる場合 (たとえば、ある団体は偶数年度、別の団体は奇数年度のみ変更) であっても、タイムスタンプ方式では変更毎に全市町村のレコードを追加する必要があります。インターバル方式なら、変更があったときに変更対象の団体のレコードだけ追加・更新すればよいです。

そういうわけで筆者は、インターバル方式は「全体としてレコード数を少なく抑えられ」るし、それが「データ変更が頻繁に発生する場合には大きな利点」だと主張しているのでしょう。


余談。どの市町村も、年がたっても人口は変わらないのか……。ほかの例の説明にも使うためにこういう人工的な例になっているのでしょうけれど、ちょっとまぎらわしいですね。

投稿2016/10/15 08:04

ikedas

総合スコア4315

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2016/10/15 08:12

たしかに、随時変化する「人口」というのは、例として適当でない気もします。
退会済みユーザー

退会済みユーザー

2016/10/15 09:43

回答ありがとうございました。 記載すべき前提がいくつか抜けておりましたが、私の知りたいことというのはikedasさんの回答の中にございました。 非常に分かりやすい解説、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問