Happiness Chain Advent Calendar 2023
5日目の記事です。
『スッキリわかるSQL入門』『達人に学ぶDB設計 徹底指南書』やYouTubeでSQL・データベース設計ついて学習したので、内容をまとめてみました。基本的なことは本や動画を見たらわかるため、本記事では個人的に重要と感じあとから見返したいときに本や動画のどこに書いてあったか忘れてしまったときのためにまとめます。
『スッキリわかるSQL入門』
5章 式と関数
5.1 式と演算子 p147
- DBMSは1行ずつ処理をしている
- 1回の処理でDBMSがすべての行を見ているわけではない
5.3 様々な関数 p154
- 関数の呼び出しも1行ずつ行っている
第6章 集計とグループ化
6.2 集計関数の使い方 p181
- COUNT(*)はNULLの行も含めてカウント
- COUNT(列)はNULLの行を含めずにカウント
6.3 集計に関する4つの注意点 p185
- 結果表はn行m列の形にならないとだめ
- 凸凹な結果表はNG、きれいな四角形じゃないとダメ
6.5 集計テーブルの活用
- 大量のデータを扱う場合に使う
- 集計処理を行い結果を集計テーブルに格納する
- 集計結果が必要な場合は既に格納されているデータを利用する
メリット
- 大量のデータから集計結果を取得する場合長い時間がかかるが、集計テーブルに事前に登録しているとすぐに取り出せる
デメリット
- 格納されているデータは集計時のものであり時間経過に伴い古くなるので、定期的に集計処理を再実行する必要がある
『達人に学ぶDB設計 徹底指南書』
第3章 論理設計と正規化 〜なぜテーブルは分割する必要があるのか
3-2 テーブルの構成要素
- 縦方向が列(カラム)
- Columnと書いたときに
C
の右に縦棒を1本足すと穴ができるので縦
- Columnと書いたときに
- 横方向が行(レコード)
- Recordと書いたときに
R
の下に横棒を1本足すと穴ができるので横
- Recordと書いたときに
参考
ひと目でわかる行列(Row ・ Column)の方向の覚え方 - Λlisue's blog
記事では行をRowと呼んでいますが、『達人に学ぶDB設計 徹底指南書』ではレコードと読んでいますのでこちらに合わせました。
- 可能な限りデータはNULLにしない
- いろんな問題を引き起こす可能性があるため
- CHECK制約はいくつでも使用できるが、複数列にまたがった使用はできない
-
A列 > B列
など
-
3-4 第1正規形
- (主)キーがNULLを含むのはNG
- 主キー列にはDBMS側でNOT NULL制約が付加される
- NULLになりそうな場合はテーブルをわけるなどして対処する
第5章 論理設計とパフォーマンス 〜正規化の欠点と非正規化
5-1 正規化の功罪
- 結合はコストの高い操作
- 結合するテーブル数やそのレコード数が多いほど処理時間がかかる
- 著者個人の立場としては「非正規化は許さない」
- 非正規化は他の手段を使ってもパフォーマンス向上が見込めない場合の最後の手段
- 正規化すればするほど望ましい
- ハードウェアの高性能化やマテリアライズド・ビューといったDBMSの機能により、非正規化を行わないでいいケースも増えている(『スッキリわかるSQL入門』p415)
第6章 データベースとパフォーマンス
6-2 インデックス設計
- ソートはかなりコストが高い処理
- ソート時はDBMS内部の専用メモリに一時的にデータを保持するため
第7章 論理設計のバッドノウハウ
7-2 ❎非スカラ値
- データは意味を崩さない範囲でなるべく分割して保存するべき
- 分割したものを結合するのは簡単だが逆は難しいから
-
山田太郎
なら山田
と太郎
-
hoge@test.com
ならhoge
とtest.com
-
- 分割したものを結合するのは簡単だが逆は難しいから
7-3 ❎ダブルミーニング
- テーブルや列や意味は変数ではないので変更不可
- 今まで体重を格納していた列に「やっぱり年齢を入れよう」というのはNG
- 列を追加するなどして対処する
小学生でもわかるデータベース設計入門。実際に設計しながら基礎を学ぼう - YouTube1
ER図 1:02:42
- 1対多のときの1の方は、横棒1個でも2個でもいい