初めに
私、約1年ほど前に本格的にプログラミングをやり始めた身でございます。
技術記事もこれが初めてでどのように書いた良いのか、模索中でございます。
拙い文章になってしまうかもしれませんが、何卒よろしくお願い申し上げます。
私の紹介
名前:ヨシキックス
年齢:20代
生息地:関西地方
現在、エンジニアを目指して、日々勉強中でございます。
前置きはここまでにして、本題に入りたいと思います。
経緯
現在、とある学習サイトにてJavaのSpring Boot というフレームワークを使って学習しております。その中で、データベース(以下、DBと略す)の物理削除と論理削除のやり方・考え方について備忘録または誰かの問題解決のヒントとして残せたらと思い、当記事を投稿しました。
物理削除
DBにおいてDELETE文などを実行し、データまたはレコードを直接消してしまう方法。
例) EMPLOYEESテーブル(社員テーブル)
Before
ID | NAME | AGE | DEPARTMENT | POST |
---|---|---|---|---|
1 | 山田太郎 | 22 | 営業部 | - |
2 | 田中次郎 | 30 | 総務部 | 課長 |
3 | 高橋三郎 | 25 | 製造部 | 主任 |
4 | 鈴木四郎 | 45 | 設計部 | 部長 |
5 | 佐藤花子 | 22 | 経理部部 | - |
-- 社員テーブルの4と5のレコードを削除するsqlを実行
DLETE FROM EMPLOYEES WHERE ID = 4 OR ID = 5;
After
ID | NAME | AGE | DEPARTMENT | POST |
---|---|---|---|---|
1 | 山田太郎 | 22 | 営業部 | - |
2 | 田中次郎 | 30 | 総務部 | 課長 |
3 | 高橋三郎 | 25 | 製造部 | 主任 |
このように、テーブルのデータ自体を削除する。
メリット
・DBのパフォーマンス向上
デメリット
・一度、消すと修復が困難
論理削除
論理削除はデータ自体は削除しないが、システム上では消したように見せかける方法。
例) EMPLOYEESテーブル(社員テーブル)
Before
ID | NAME | AGE | DEPARTMENT | POST | DELETED_AT |
---|---|---|---|---|---|
1 | 山田太郎 | 22 | 営業部 | - | NULL |
2 | 田中次郎 | 30 | 総務部 | 課長 | NULL |
3 | 高橋三郎 | 25 | 製造部 | 主任 | NULL |
4 | 鈴木四郎 | 45 | 設計部 | 部長 | NULL |
5 | 佐藤花子 | 22 | 経理部部 | - | NULL |
-- 社員テーブルの4と5のレコードを論理的に削除するsqlを実行
UPDATE EMPLOYEES SET DELETED_AT = NOW() WHERE ID = 4 OR ID = 5;
After
ID | NAME | AGE | DEPARTMENT | POST | DELETED_AT |
---|---|---|---|---|---|
1 | 山田太郎 | 22 | 営業部 | - | NULL |
2 | 田中次郎 | 30 | 総務部 | 課長 | NULL |
3 | 高橋三郎 | 25 | 製造部 | 主任 | NULL |
4 | 鈴木四郎 | 45 | 設計部 | 部長 | 実行した日時 |
5 | 佐藤花子 | 22 | 経理部部 | - | 実行した日時 |
このように、データ自体は残っているが、レコードを UPDATE
することにより、削除対象とそれ以外の切り分けを行うことが出来る。あとはプログラム自体に、DELETED_AT
が NULL
でなければシステム上から見えなくする処理を実装すれば、削除したように見せかけることが出来る。
メリット
・データの修復が容易
デメリット
・データが増えることによってはパフォーマンスの低下する恐れがある
まとめ
初投稿でどういったものを書けばいいか、わからなかったが今回は物理削除や論理削除などのDB関係の知識は今後、エンジニアになるうえでは大事なってくるので、こういった機会に情報の整理をしっかりして理解に努めたいと思いました。