SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy.
SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details.
Successfully reported this slideshow.
Activate your 14 day free trial to unlock unlimited reading.
7.
諸君は自らの経験からいくらか学ぶことがで
きるという、全く愚かな考えであろうが、
余はむしろ他人の失敗を学ぶことで、自分の
失敗を回避することを好む。
─オットー・フォン・ビスマルク
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.
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,
...
);
二つのテーブルの間の整合性はトリガー等で
保つ (詳しくは『理論から学ぶデータベース実践入門』を)