Help us understand the problem. What is going on with this article?

【ふくだ学習録】SQLアンチパターン part5【19日目】

ふくだ学習録とは?

ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

読了した本

データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]
ゼロから作るDeepLearning
PHPフレームワーク CakePHP 3入門

今読んでいる本

SQLアンチパターン

SQLアンチパターンを読んで

21:シュードキー・ニートフリーク(擬似キー潔癖症)

欠番を気にしすぎる時に発生するもの。

アンチパターン:隙間を埋める

欠番を埋めるために、最も小さい欠番から情報を埋めていくのはアンチパターン。
不要なクエリ(何番が欠番になっているのか)を投げる必要が出てきてしまう。
また既存行に番号を振り直すのもアンチパターン。番号の振り直しには、競合状態を引き起こす可能性が高く、欠番が多い場合は、さらにその可能性が上がってしまう。また擬似キージェネレータが作成する番号は、最後に作成したキー番号に+1したものなので、結局は欠番が発生してしまう。

解決策:擬似キーの欠番は埋めない

行番号と主キーは同意ではない。行番号には欠番が発生しない(結果セットに対しての行の順序番号を示すものだから)が、主キーには欠番が発生する。この特性を十分理解した上で活用すべし。

また従来の擬似キージェネレータを使用する代わりに、GUID(グローバル意識別子)を使用することも検討する。GUIDを使用することで、複数のデータベースサーバー間で重複した値を生成することなく、並行して擬似キー作成できるようになったり、欠番を気にすることもなくなる。(ただし16バイト必要なので、実行時間が長くなるなどのデメリットはある)

シー・ノー・エビル(臭いものに蓋)

データベースAPIの戻り値を無視したり、アプリケーションコード内に点在するSQLしか読まないことで発生しがちな問題。

アンチパターン:SQL文字列を組み立てるアプリケーションコードの側からデバックを開始すること。

最終的に投げられているSQLに対してのエラーから徐々に紐解いていくほうが、結果的に早く解決できる。

解決策:エラーから優雅に回復する

データベースからエラーが返ってくることを想定して、エラー発生時もブランクページを表示させないような処理を書いておく。

ディプロマティック・イミュニティ(外交特権)

SQLに対してだけ、ベストプラクティスを実施しないがために生まれる技術的負債のことなどを指して使われる言葉。
SQLもGit管理を行なったり、テストコードを記載したりすべき。

解決策:包括的に品質問題に取り組む

ER図を用いた文書化、バージョン管理、テスティングを行う。

マジックビーンズ(魔法の豆)

アクティブレコード機能に頼りすぎて、それ以外の解決策(技術)を使用しなくなること。柔軟性を失った開発をしてしまうこと。

アンチパターン:モデルがアクティブレコードそのもの

解決策:モデルがアクティブレコードを「持つ」ようにする

MVCアーキテクチャとしてのモデルの特性は、「リレーショナルDBに保存してあるデータをオブジェクト指向でのモデルで扱えるようにする」ことである。なので複数のテーブルに対してアクティブレコードを行い、ビジネスロジックを持ったオブジェクトを作成する、といったようにモデルがアクティブレコードを持つ(利用している)状態にすることが重要。

砂の城

天災などによって起こりうる影響(事故)に関して、事前に対策を行なっておくべき。という考え方。

アンチパターン:想定不足

今日の一言

24章はめちゃめちゃためになった!
モデルはドメイン単位で作成すべきやなぁ、って感じたけどCakePHPなら逆にドメイン単位でモデル作成しにくくない??って感じてしまった。どうなんやろ?
今度Larabvel使ってドメイン単位でモデル作ってみよ!

fukuda_fu
フロントエンドエンジニアです。普段はReact書いたりしてます。 勉強がてらにアウトプットします。よろしくです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away