6.
諸君は自らの経験からいくらか学ぶことがで
きるという、全く愚かな考えであろうが、
余はむしろ他人の失敗を学ぶことで、自分の
失敗を回避することを好む。
─オットー・フォン・ビスマルク
Nur ein Idiot glaubt, aus den eigenen Erfahrungen zu lernen.
Ich ziehe es vor, aus den Erfahrungen anderer zu lernen, um
von vorneherein eigene Fehler zu vermeiden.
28.
解決策1: せめて削除日にしてみる
CREATE TABLE Bugs (
id SERIAL PRIMARY KEY,
bug_code VARCHAR(20) NOT NULL,
date_reported DATE NOT NULL,
summary VARCHAR(80),
description VARCHAR(1000),
deleted_at DATETIME,
...
);
Rails の論理削除プラグインの多くがこの設計。
しかしカラムに NULL が入るとインデックスを使え
ないデメリットがある
29.
解決策1: もうちょっとマシに
CREATE TABLE Bugs (
id SERIAL PRIMARY KEY,
bug_code VARCHAR(20) NOT NULL,
date_reported DATE NOT NULL,
summary VARCHAR(80),
description VARCHAR(1000),
closed_at DATETIME NOT NULL
DEFAULT ‘9999-12-31 23:59:59’,
...
);
ドメインの言葉(closed_at)を使いつつ、加えてカラムに
NOT NULL 制約を付ける(未来日のマジックナンバー)
30.
We won t support soft-delete at all.
If you want to implement a soft-delete
alike behaviour its probably a good
idea to look into the State pattern
instead.
̶ Doctrine 2 Behaviours in a Nutshell
http://www.doctrine-project.org/2010/02/17/doctrine2-behaviours-nutshell.html
解決策2: それはフラグではなく状態である
31.
CREATE TABLE Bugs (
id SERIAL PRIMARY KEY,
bug_code VARCHAR(20) NOT NULL,
date_reported DATE NOT NULL,
summary VARCHAR(80),
description VARCHAR(1000),
status VARCHAR(20) NOT NULL DEFAULT ‘NEW',
...
FOREIGN KEY (status) REFERENCES BugStatus(status)
);
IsDeletedフラグを使う代わりに、Dahan氏はデータの状態を表すフィールドを保持する
ことを提案している。例えば、有効、中止、キャンセル、廃止予定のような状態だ
http://www.infoq.com/jp/news/2009/09/Do-Not-Delete-Data
Rails のプラグインでは AASM が便利
解決策2: それはフラグではなく状態である
32.
解決策3: 履歴テーブルに移す
CREATE TABLE BugHistories (
bug_id INTEGER PRIMARY KEY,
bug_code VARCHAR(20) NOT NULL,
date_reported DATE NOT NULL,
summary VARCHAR(80),
description VARCHAR(1000),
archived_at DATETIME,
...
);
二つのテーブルの間の整合性はトリガー等で
気合いで保つ
Be the first to comment