インターネットに読めと言われている気がしたので読んだ。
論理設計
一意性と参照整合性に留意する。交差テーブルや従属テーブルを導入する。これは理解できた。
個人的には、ORMはクエリを意識しづらいし使いたくない。
リレーショナルモデルでは、正規化により重複を完全に除去して、結合して頑張ることが正しいとされている。
しかし、実際にはRDBMSは完全なリレーショナルモデルではなく、
結合操作によってパフォーマンスが出ないことがある。
そのために、あえて正規化をしない「非正規化」の存在を知った。
が、具体的にどの状況で使うのか良くわかっていない。
物理設計
- FLOAT型は丸め誤差を避けられないので、科学演算でない限りはNUMERIC型を使う
- マスタテーブルは参照テーブルにして、参照元から外部キー指定する
- トランザクション処理を考慮して、画像はBLOBとしてデータベース内部で管理する
- インデックスを貼る場合、闇雲に貼るのではなく、スロークエリログとクエリ実行計画をよく見てから考える
画像の扱い方に関して、最近はS3などのストレージに委譲することが多いため
一概には言えないと思った。
正直、アンビギュアスグループはよくわからなかった…。また読みます
クエリ
- NULLはUnknownであり、値ではない。NULLの代替を使うのはダメ
- パフォーマンスのために、全文検索はサードパーティのエンジンを使う
- DBへのアクセスは減らすべきだが、可読性・複雑性の緩和のために分割クエリを使う
- 列名は明示する
なんでそもそもNULLが出てきたんだっけ?という問いに自身で明確に答えられなかったので、『理論から学ぶデータベース実践入門』を再読する必要がありそう。
アプリケーション
- セキュリティのためにパスワードはソルト足してハッシュ化、パスワードリセットはトークンで
- SQLインジェクションを防ぐためにプリペアドステートメントを使う
- データベースAPIの戻り値を確認
- SQLも文章化・バージョン管理・テストをやる
- データベース処理をカプセル化するドメインモデルを用意する
まとめ
冗長性を排除し、整合性を確保するのが正規化であるが、パフォーマンスは考慮していない。
基本的には整合性を考慮したテーブル設計・クエリ設計をすべきだが、規模感やパフォーマンスのため非正規化することもあり得る。
正規化段階はちゃんと覚える。