11
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

現実世界で完全な削除(DELETE)は存在しない

Last updated at Posted at 2021-06-26

Webアプリケーションの概念の1つのCRUD処理

CRUD処理

- - -
C CREATE タレントを作成する
R READ タレントを閲覧する
U UPDATE タレントを更新する
D DELETE タレントを削除する

今回、着目したいのはDELETE、削除する処理。

注意しないといけないのは、完全に削除することは現実世界ではありえない
例えば、タレントが退会したという処理をおこなうときに安易にタレントをDELETEして完全に削除してしまうと、退会したという情報は取得できない。

現実を抽象化したデータを忠実に再現するためにはDELETEは実行しない方がいい。
タレントを安易に削除するというのは、タレントが複業クラウドを使っていたという事実を削除することに値する。

ではどうやって実装するか?

論理削除

データベースから直接データを削除せず、削除フラグまたは削除日時を更新して退会を表現。

users

id name  
1 たなか
2 さとう
3 おだ
-- 通常の削除(物理削除)
DELETE users  WHERE users.id = 3

-- 論理削除
UPDATE users SET deleted_at = '2021-06-25 06:43:21' WHERE users.id = 3

通常の削除(物理削除)

id name  
1 たなか
2 さとう

論理削除

id name deleted_at
1 たなか
2 さとう
3 おだ 2021-06-25 06:43:21

メリット

  • 退会したユーザを取得するのが簡単
SELECT * FROM users WHERE deleted_at IS NOT NULL;

デメリット

  • 表示時にWHERE句にフラグの確認が必要になる(バグの原因。アクティブなユーザを取得したい)
-- 削除したユーザまで取得してしまう、、、。
SELECT * FROM users;
  • データが肥大化するため、パフォーマンスが落ちる

削除のタイミングで履歴テーブルに移す

INSERT INTO deleted_users SELECT users WHERE users.id = 3
DELETE users WHERE users.id = 3

deleted_users

id name  
3 おだ

users

id name  
1 たなか
2 さとう

メリット

  • SELECTで論理削除を意識しなくてよくなる
-- ユーザだけ取れる
SELECT * FROM users;

デメリット

  • 2つのテーブルを行ったり来たりする必要がある(めんどくさい、、。)
  • 関係テーブルも履歴を作る必要があり、複雑になる

結論

正解はない。
削除(完全消滅)というのは現実世界に存在しない概念なので、DELETE処理を実装する際は注意!!
メリット・デメリットを考慮して実装する必要がある。

▼複業でスキルを活かしてみませんか?複業クラウドの登録はこちら!
https://talent.aw-anotherworks.com/?login_type=none

11
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?