ざきの学習帳(旧 zackey推し )

日々の学びを書きます

SQLアンチパターンざっと読んだ / SQLだけかと思ったらテーブル系のアンチパターンも書いてあった

良書良書と聞いていたSQLアンチパターンですが、題名からSQLに特化した内容と思い込み、今まで読んでいませんでした。

www.oreilly.co.jp

先日、本書に記載されている「とりあえずID」のアンチパターンを踏んでいることを指摘いただき、購入に至った...という経緯です。

※電子版が欲しかったため、オライリーから購入しました。

本記事には、第1部をゆっくり、他部をざっくりと読み進めた際、思ったこと等を記載します。

新卒に入ったプロジェクトでは、第1部に記載されていたアンチパターンを全て網羅していた(唖然)

第1部で紹介されていたアンチパターンは以下です。1

2013年発行ということもあり、本書を題材に公開された記事やスライドが豊富です。そちらのリンクを貼りながら、実際に業務で体験したアンチパターン事例を記載していきます。

ジェイウォーク(信号無視)

www.slideshare.net

製品の不具合理由(複数)を保持するため、IDをカンマ区切りで保存させていました。マスタからレコード削除することで、例外発生...みたいな苦い記憶が蘇りました。

ナイーブツリー(素朴な木)

www.slideshare.net

製造業における、BOM)の素材 - 製品表を表していました。やはり、階層が深くなるたび検索性が悪くなり、UNIONやサブクエリを駆使して抽出していた覚えがあります。

IDリクワイアド(とりあえずID)

このアンチパターンを踏み、本書を手に取りました。 😇

ノータイムでORMから生成されるIDを定義していたので、今後注意していきたいと思います...。

キーレスエントリ(外部キー嫌い)

www.slideshare.net

外部キー制約により、意図しない削除を防ぐため...といった理由から、外部キーを設定しなかった記憶があります。でも、これにより、データパッチを当てた際、考慮漏れにより出たゴミレコードが残るといったことがありました。

EAV(エンティティ・アトリビュート・バリュー)


製品の設計情報をマスタ管理していたのですが、よく項目が変わるため、EAVを用いていました。

当時はORMも使っていなかったため、対処としてはシングルテーブル継承になると思うのですが、柔軟性を考慮してEAVにしてしまったのかな...思いました。

ポリモーフィック関連

spice-factory.co.jp

共通・個別の製品情報を管理するために用いてました。これもデータパッチ対象のテーブルに漏れがあると、ゴミレコードが発生してました。

マルチカラムアトリビュート(複数列属性)

qiita.com

コンボボックスで選択された値に応じて、画面項目を変動させるため、Field1〜50のようなカラムを設けていました。

メタデータトリブル(メタデータ大増殖)

www.slideshare.net

言わずもがな、年別にテーブルを分けてました。

ただ、要件的に最新1年のデータのみを参照できるようにすればいい(他データは、保守で抽出してもらえればいい)というような制約があったため、すぐ考えつきそうなこのアンチパターンが用いられたのかな...と思います。

自分が知っている手法は、すべてアンチパターンじゃないかと思える

アンチパターンだらけのアプリケーション開発をしてきましたが、それがアンチパターンとも気づきませんでした。(当時、冗長・保守性に乏しいからどうにかしたいと思いつつ、問題提起したところで変わらないな...と思い、放置してました。)

そのつけが今、自分にも降りかかってると思うと、自業自得です。

今年はどうあるべきか、どうしないべきかが語られている本を漁ろうかなと思います。

参考になりそうな記事・スライド

ググってた際、包括してSQLアンチパターンについて説明してる記事やスライドがありましたので、まとめときます。

www.slideshare.net