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),
deleted_at DATETIME,
...
);
Rails の論理削除プラグインの多くがこの設計
(機械的な WHERE 句は減らないが、プラグインに書かせる)
しかしカラムに NULL が入るとインデックスを使えないデメ
リットがある
30. 解決策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 の論理削除プラグインの多くがこの設計
(機械的な WHERE 句は減らないが、プラグインに書かせる)
しかしカラムに NULL が入るとインデックスを使えないデメ
リットがある
問題解決に
なっていない
31. 解決策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 制約を付ける(未来日のマジックナンバー)
32. 解決策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 制約を付ける(未来日のマジックナンバー)
まだ問題解決に
なっていない
33. 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: それはフラグではなく状態である
34. 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-
Rails のプラグインでは AASM が便利
解決策2: それはフラグではなく状態である
35. 解決策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,
...
);
二つのテーブルの間の整合性はトリガー等で
保つ (詳しくは『理論から学ぶデータベース実践入門』を)