Open19

達人に学ぶDB設計(1章-2章)

koyukoyu

データベースを制すものはシステムを制す

この本は「なんとなくわかっている」を「仕組みと理由がわかっている」に
レベルアップさせ、DB設計をしっかり理解できる1冊

koyukoyu

データ設計するのに大事な概念として3層スキーマがある

  • 外部スキーマ(ユーザーから見たデータ)
  • 概念スキーマ(開発者から見たデータベース、論理設計とも言う)
  • 内部スキーマ(DBMSからみたデータベース、物理設計とも言う)

小規模のシステムでは概念スキーマがなく、外部スキーマと内部スキーマに吸収させることもある。

ただ、概念スキーマがないと変更に対する柔軟性が無くなる。

koyukoyu

「これがなかったらどういう不都合が生じるだろう?」の視点が大事

なぜこれが必要なのか?何の役にたつのだろう?と疑問に思う場合は、長年の試行錯誤によって生み出された工夫であることがしばしば。

そのため、
「これがなかったらどういう不都合が生じるだろう?」

と考えることで直感では理解できなかった有用性があきらかになります。

koyukoyu

6章まで読んだら以下の演習を再度やる

プロジェクトは佳境でテスト工程に差し掛かっている。

  • 1時間で終わる夜間バッチのSQLが10時間かかっている問題
  • 画面からオンラインで出力する帳票において情報が不足していた。用件調整の漏れがあったことが原因。

思いつく解決策

SQLはパフォーマンスチューニングするとして、何するんだろう?
具体的にはわかんないなぁ。
SQLの処理を整理してボトルネックを探すところから?複数行にわたる無駄な処理がないかとか見るのかな?

  • インデックス系の問題
  • SQL文自体の問題
    のどっちかか?

要件漏れは出力する情報を出せるようなデータベース設計にするとかか?

koyukoyu

エンティティは実体。
物理的な実態から概念的な実体もあると。

koyukoyu

正規化ってなんですか?って聞かれたらこれ答えよう。分かりやすい

正規化は特に更新(登録、変更、削除)が整合的に行えるように整理する作業。

koyukoyu

物理設計って何するんや
テーブル定義ってER図そのまま使うんじゃダメなんか?

物理設計には大きく分類して以下の5つのタスクが含まれます。

  1. テーブル定義
  2. インデックス定義
  3. ハードウェアのサイジング
  4. ストレージの冗長構成決定
  5. ファイルの物理配置の決定
koyukoyu

なるほど

データベースの性能問題のほとんどはストレージのI/Oによって引き起こされます

koyukoyu

攻撃全振りしときゃ強いゲームとは大違い

データの正規化によ整合性とパフォーマンスの間に強いトレードオフの関係がある。
つまり、データベース設計とは限られた予算制約の中で両端の間の平衡点を見つけ出そうとする努力と言っていい

koyukoyu

クラウドがあるとそうでもないか?

サイジングは難易度の高いタスク

koyukoyu

1番最初に思いつきそうな方法にそれっぽい名前つけるなw

ストレージの冗長性を担保するのにRAIDという技術がある。
複数のディスクに同じデータを書き込んで冗長化する
複数のハードディスクドライブ(HDD)を一つのドライブのように認識・表示させる技術
これは、Redundant Array of Inexpensive Disksの略

※追記 RAIDは一般的に使われている用語だったすいません

koyukoyu

DBに保存されるのは大まかに以下の5種類
最近はDBMSが自動的に配置してくれるからエンジニアが意識することはないが基本的な考え方を押さえておくと良い。

え、テーブルのデータとインデックスファイルが別れてるの...?

❶データファイル
❷インデックスファイル
❸システムファイル
❹一時ファイル
❺ログファイル

koyukoyu

へー、

時々、表領域やデータベースといった論理レベルで分離すれば、I/Oが分散されると考えている人を見かけますが、これは物理層を意識しない人に典型的な勘違いです。

今も意識することあんのかな?DBが勝手にやってくれる?

5種類のファイルの物理配置を考える際に、最もファイルI/O量が多いデータファイルとインデックスファイルは異なるディスクに分散するのが好ましい

koyukoyu

考え方はシンプルだな〜

レプリケーションとは、現用系(Activeやマスタ、プライマリとも呼ばれます)と待機系(Standby、スレーブ、セカンダリとも呼ばれます)からなる複数のデータベースを用意し、現用系から待機系へ更新データの情報を送信してデータベースのレベルでデータが同じになるようにする技術です。

なるほどな、参照は待機系にして、現用に更新などの処理をすることで負荷分散もできるのか

koyukoyu

【コラム】物理レプリケーションと論理レプリケーション

同期、非同期とは異なる概念

たとえ話 物理レプリケーション 論理レプリケーション
例えると 本棚ごとコピーする 本の中身(内容)だけ選んで写す
一致性 本棚の見た目も中身も同じ 内容は同じでも見た目は別でもよい
柔軟性 低い(全体一括) 高い(選べる)
koyukoyu

そんな...

AWSは、データベースに限らず一般的にストレージのRAIDレベルとして5と6を推奨していない

koyukoyu

まじか、ファイブナイン

金融系や電力など社会インフラの分野では稼働率はファイブナイン、つまり99.999%以上が求められることがしばしばあります。

koyukoyu

データを万が一でも失わないように可用性設計とバックアップ, リカバリがあると

バックアップの主要な分類基準は一つしかなく以下の3つの方法を組み合わせる

  1. フルバックアップ
  2. 差分バックアップ
  3. 増分バックアップ
koyukoyu

バックアップの主な手順

  1. リストア(フルバックアップしたデータを戻す)
  2. リカバリ(差分または増分バックアップしていたトランザクションログを残す)
  3. データベースサーバーに残っているトランザクションログを適用する(ロールフォワード)

これらをすることで、障害発生時の直前まで復旧することができる。