Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RDBアンチパターンと戦う - 削除フラグ 完全攻略ガイド / delete flag

soudai sone
February 12, 2024

RDBアンチパターンと戦う - 削除フラグ 完全攻略ガイド / delete flag

PHPカンファレンス関西の登壇資料です。
WEB+DB PRESS Vol.134に詳細があります
https://gihyo.jp/magazine/wdpress/archive/2023/vol134

soudai sone

February 12, 2024
Tweet

More Decks by soudai sone

Other Decks in Technology

Transcript

  1. RDBアンチパターンと戦う
    - 削除フラグ 完全攻略ガイド -
    PHPカンファレンス関西

    View full-size slide

  2. この話は


    上の2冊でも紹介しています

    What is it?

    View full-size slide

  3. データベースの寿命は


    アプリケーションより長い

    What is it?

    View full-size slide

  4. 削除フラグは


    はアンチパターン

    What is it?

    View full-size slide

  5. それを知っていても


    どう立ち向かえばいいかわからない……

    What is it?

    View full-size slide

  6. そんな人のために


    削除フラグとの戦い方をお伝えします

    What is it?

    View full-size slide

  7. 1. 自己紹介

    2. アンチパターン:とりあえず削除フラグ

    3. あるべき姿

    4. 移行先のテーブルとダブルライト

    5. 子テーブルへ分割

    6. まとめ

    あじぇんだ

    View full-size slide

  8. 1. 自己紹介

    2. アンチパターン:とりあえず削除フラグ

    3. あるべき姿

    4. 移行先のテーブルとダブルライト

    5. 子テーブルへ分割

    6. まとめ

    あじぇんだ

    View full-size slide

  9. 自己紹介

    曽根 壮大(39歳)

    Have Fun Tech LLC 代表社員

    株式会社リンケージ CTO


    そ

    ● 日本PostgreSQLユーザ会 勉強会分科会 担当

    ● 3人の子供がいます(長女、次女、長男)

    ● 技術的にはWeb/LL言語/RDBMSが好きです

    ● コミュニティが好き
    たけ

    ね
 とも


    View full-size slide

  10. 突然の宣伝

    
予防医療のリンケージ



    ● リモートワークの不安を数値にするストレスチェック
    ● 女性の健康課題をサポートする
    ● リモートワーク、ちょっとした心配を相談できる安心をご提供

    View full-size slide

  11. 1. 自己紹介

    2. アンチパターン:とりあえず削除フラグ

    3. あるべき姿

    4. 移行先のテーブルとダブルライト

    5. 子テーブルへ分割

    6. まとめ

    あじぇんだ

    View full-size slide

  12. 削除フラグの引力



    とりあえず削除フラグ

    View full-size slide

  13. ことのはじまり



    とりあえず削除フラグ

    View full-size slide

  14. とりあえず削除フラグ
    id name created_at delete_flag
    1 Taro 2023-03-10 12:00:00 false
    2 Hanako 2023-03-11 14:00:00 false
    3 Jiro 2023-03-12 10:30:00 true
    4 Yoko 2023-03-13 16:45:00 false
    5 Ken 2023-03-14 09:15:00 true

    View full-size slide

  15. Aさん:あー、テーブルは論理削除を使っているね。delete_flag
    という削除フラグが付いている。

    Bさん:O/Rマッパに前任の人が独自に実装した機能が追加し
    てあって、この削除フラグはWHERE句に自動的に付与される
    んだよね。

    Aさん:なるほど。メジャーなO/Rマッパでも論理削除を使える
    拡張もあるし、これで問題はなさそうだね。

    とりあえず削除フラグ

    View full-size slide

  16. 数年後……



    とりあえず削除フラグ

    View full-size slide

  17. Cさん:データがすごく大きくなったから、削除フラグがtrueの
    データを消そうかな。

    Aさん:ダメダメ! 削除フラグがtrueのデータも参照しているか
    ら消せないよ。

    Cさん:削除フラグなのに削除できないんですか……。

    とりあえず削除フラグ

    View full-size slide

  18. アンチパターンは


    良かれと思ったことが後から問題になる

    とりあえず削除フラグ

    View full-size slide

  19. 削除フラグの問題



    とりあえず削除フラグ

    View full-size slide

  20. ● クエリが複雑になる

    ● パフォーマンスが低下する

    ● 制約が活用できず整合性を犠牲にする

    とりあえず削除フラグ

    View full-size slide

  21. SELECT
    *
    FROM
    user
    -- customerをJOINして確認
    INNER JOIN customer AS c
    ON user.id =c.user_id
    AND c.delete_flag = false
    WHERE user.delete_flag = false;
    削除フラグがある場合に有効なユーザー
    を取得したいときのSQLは、SELECT *
    FROM user WHERE delete_flag =
    falseになります。
    では、ユーザーに紐付く会社や組織にも削
    除フラグがあった場合はどうでしょうか。
      所属している会社が削除されているの
    にユーザーが取得できることはバグの温
    床になり、たいへん危険です。 そのため、
    次のSQLになります。
    クエリが複雑になる

    View full-size slide

  22. INDEXの利用が難しいため


    パフォーマンスが劣化する

    とりあえず削除フラグ

    View full-size slide

  23. 制約が活用できない



    とりあえず削除フラグ

    View full-size slide

  24. とりあえず削除フラグ
    id name created_at delete_flag
    1 Taro 2023-03-10 12:00:00 false ←削除されたユーザー
    2 Taro 2023-03-11 14:00:00 true ←同名だがidが違うので別ユーザーの扱い
    3 Jiro 2023-03-12 10:30:00 true
    4 Yoko 2023-03-13 16:45:00 false
    5 Ken 2023-03-14 09:15:00 true

    View full-size slide

  25. これらの要素が


    トラブルの温床になる

    とりあえず削除フラグ

    View full-size slide

  26. 1. 自己紹介

    2. アンチパターン:とりあえず削除フラグ

    3. あるべき姿

    4. 移行先のテーブルとダブルライト

    5. 子テーブルへ分割

    6. まとめ

    あじぇんだ

    View full-size slide

  27. 削除フラグが無い姿を目指す



    あるべき姿

    View full-size slide

  28. 削除フラグが無い姿を目指す

    ↓

    1つのテーブルに1つの責務の状態にする

    あるべき姿

    View full-size slide

  29. あるべき姿
    https://soudai.hatenablog.com/entry/2018/05/01/204442

    View full-size slide

  30. 1. 自己紹介

    2. アンチパターン:とりあえず削除フラグ

    3. あるべき姿

    4. 移行先のテーブルとダブルライト

    5. 子テーブルへ分割

    6. まとめ

    あじぇんだ

    View full-size slide

  31. 1. 自己紹介

    2. アンチパターン:とりあえず削除フラグ

    3. あるべき姿

    4. 移行先のテーブルとダブルライト

    5. 子テーブルへ分割

    6. まとめ

    あじぇんだ

    View full-size slide

  32. WEB+DB PRESS Vol.134


    実践データベースリファクタリング

    を読んでくれ!

    リファクタリング

    View full-size slide

  33. 1. 自己紹介

    2. アンチパターン:とりあえず削除フラグ

    3. あるべき姿

    4. 移行先のテーブルとダブルライト

    5. 子テーブルへ分割

    6. まとめ

    あじぇんだ

    View full-size slide

  34. リファクタリングは


    日常的に行う

    まとめ

    View full-size slide

  35. 失敗を恐れるのではなく


    失敗できるようにする

    まとめ

    View full-size slide



  36. “手を動かした者だけが、世界を変える”




    株式会社はてな id:onishi

    人生を変えるために必要なこと

    View full-size slide

  37. ご清聴ありがとうございました



    まとめ

    View full-size slide