学習することができます。
学ぶ目的
「今どうなっているか」と「何があったか」
データには2種類の持ち方があります。
| 持ち方 | 例 | 分かること |
|---|---|---|
| 状態(今の値) | 受講:修了 | 今どうなっているか |
| 履歴(出来事) | 10/3 に受講開始、10/9 に修了 | いつ、何があったか |
状態だけ持つのは簡単です。でも「いつ修了したか」「何日かかったか」は、状態からは分かりません。あとで聞かれそうな問いがあるなら、出来事のほうも残します。
naminori で実際に起きたこと:修了したのに修了日が空
naminori の受講には、「学習中か修了か」という状態と、「修了した日時」の2つを持たせていました。
2026年9月に調べると、受講158件すべてで修了日時が空でした。修了になっている37件も含めてです。講座を修了にする処理は1か所だけで、そこが状態だけを書き換え、日時を書いていなかったのが原因でした。ダッシュボードには修了日時を表示していたので、修了しても空欄になっていました。
教訓は2つあります。
- 状態と、その状態になった日時のように一緒に変わるべき値は、変える場所を1か所にして、そこで両方を書く
- 表示しているのに中身を確かめていない値は、壊れていても誰も気づかない
「更新日」は何の更新か
もう1つの実例です。記事には「レコードが最後に書き換わった日時」が自動で記録されます。でも読者に見せる「更新日」は、本文を書き直した日です。誤字を直しただけ、カテゴリを付け替えただけでもレコードは書き換わります。
naminori では、検索エンジンに伝える更新日に前者を使っていたため、83本中56本で、画面の更新日とずれていました。同じ「更新日」という言葉で、2つの別の事実を指していたのです。名前を付けるときは「何が起きた日か」まで言えるようにします。
その時点の値を残す
注文が商品の「今の価格」を参照していると、値上げした瞬間に過去の注文の金額が変わります(sqlite3 で確認)。
商品の価格を参照した合計 … 700(値上げ後の価格で計算された)
注文時の単価を残した合計 … 600(実際に払った金額)
注文には注文時の単価を写して残します。第4回の「1か所に」と矛盾するように見えますが、注文時の単価と現在の価格は別の事実です。naminori の修了テストも、問題を直したときに過去の解答がどの版の問題に対するものか分かるよう、問題に版を持たせています。
削除するか、残すか
「退会」「求人の掲載終了」を、データの削除で表すか、状態の変更で表すか。応募や受講など、他の出来事から参照されているものを消すと、その出来事が宙に浮きます。消してよいのは、何からも参照されず、あとで聞かれることもないものだけです。
このレクチャーで学ぶこと
- 状態と履歴の違い
- 修了日時が全件空だった実例
- 「更新日」が2つの事実を指していた実例
- その時点の値を残す
- 削除するか状態を変えるか
質問
まだ質問は投稿されていません。
質問投稿
ログイン後に質問の投稿ができます。