データベースの履歴データの持ち方

データベースの履歴データの持ち方

データベースの履歴データの持ち方について、考えてみました。

SEQ 履歴 料金
1 1 100

上記のようなデータがあるとします。

料金が間違っていたので訂正します。レコードは以下のようになります。

SEQ 履歴 料金
1 1 100
2 2 200

料金を200円に訂正しました。このデータを取得するには履歴 = MAX(履歴)を取得する必要があります。副問い合わせになります。

履歴の考え方を以下のように変えるとSQLを副問い合わせなしにすることができ、パフォーマンスが良いです。具体的には履歴の最新=1とする考え方です。

SEQ 履歴 料金
1 1 100

訂正があると、現在のMAX(履歴) + 1で今のデータをインサートします。以下のようなデータができます。

SEQ 履歴 料金
1 1 100
2 2 100

履歴=1が最新なのでそのデータに対して料金を訂正します。

SEQ 履歴 料金
1 1 200
2 2 100

さらにわかりやすくするためにもう一度訂正します。(履歴=MAX(履歴) + 1のデータに履歴をアップデートする)

SEQ 履歴 料金
1 1 200
2 2 100
3 3 200

履歴=1のデータに対して料金訂正します。

SEQ 履歴 料金
1 1 300
2 2 100
3 3 200

このように履歴を持つと、WHERE句は履歴=1とするだけでよくなります。

 

コメント

タイトルとURLをコピーしました