nissy.dev

Databaseの基礎

4 min read
目次

新卒研修ではデータベースの基本的な知識については扱わなかったが、一度覚えなおした方が良いと感じて勉強した時のメモ。

データベース

  • データベース = 整理整頓されたデータの集まり
    • データは壊れると取り戻せない
    • 高い堅牢性、セキュリティが要求される
    • トランザクション が ACID 特性を満たす必要がある
      • トランザクション = データベース操作する際の一つのかたまりの処理
  • ACID 特性
    • Atomicity (原子性)
      • トランザクションの途中の中途半端な状態にならない
      • トランザクション内の処理がすべて完了するか、全て失敗するかのどちらかの状態しかとりえない
    • Consistency (一貫性)
      • データの不整合が起きない
      • データベースの制約を破壊することがない
    • Isolation (分離性)
      • トランザクションが並列で実行されている場合、他のトランザクションからはトランザクションの途中の状態が見えない
      • トランザクション同士は、お互いに影響を与えない
    • Durability (永続性)
      • トランザクションの結果がちゃんと永続化される
      • トランザクション完了後にデータベースが異常終了しても、​ 結果は失われない
  • データベースの種類
    • Relational Database​
      • MySQL、PostgreSQL、SQLite、Oracle
    • Key Value Store​
      • Redis、Memcached
    • Document Store​
      • MongoDB

データベースの設計

  • 良い設計とは...?
    • 不整合が起きにくいデータベース
    • データの重複はなくしていく
  • 正規化理論
    • 第一正規化:重複するカラムや分割可能なカラムを削除する
      • 例えば、注文のカラムに 山田さん:ラーメン 、趣味のカラムに 映画館、旅行 はだめ、分割するべき
    • 第二正規化:部分関数従属となっている非キー属性を別テーブルへ分割する
      • 部分関数従属 = 主キーの一部によって値が決定する関係
        • 完全関数従属 = 全ての主キーによって値が決定する関係
      • 主キー = レコードを一意に決めるカラム・要素
      • 非キー属性 = 主キー以外のカラム・要素
    • 第三正規化:推移関数従属となっている非キー属性を別テーブルに分離する
      • 推移関数従属 = 主キー以外の要素同士での依存関係
  • ポイント
    • 永続化するデータは全てかき集めて、整理する
      • 機能を使っている人でもデータ設計に必要な情報を完全に把握しているとは限らない
    • テーブルは分割しすぎてもよくない
      • 分割すればするほど参照は大変になる

インデックス

  • インデックス = 索引
    • DB のフルスキャンを防ぎ、カラムのある値へ高速にアクセスできる
    • 検索項目の属性値に重複・偏りが少ない時に有効
  • インデックスのデメリット
    • データの登録や更新が遅くなる
    • インデックス分のディスクを食う

参考資料